FramelessWindow实现qt无边框窗口

这篇具有很好参考价值的文章主要介绍了FramelessWindow实现qt无边框窗口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

FramelessWindow.h文件链接

添加FramelessWindow.h头文件

在你的qt项目中将FramelessWindow.h头文件导入进来,或者使用cmake、qmake将包含该头文件的目录引入。

简单浏览framelessWindow代码

我们发现FramelessWindow是一个继承模板参数的类模板。
FramelessWindow实现qt无边框窗口

并且看一下构造函数

FramelessWindow实现qt无边框窗口

简单实现

1.继承该类模板,如果你想创建一个QFrame窗口那么就用QFrame当 模板参数,如果创建QMainWindow窗口就使用QMainWindow,QDialog就QDialog。

这里我使用QFrame

FramelessWindow实现qt无边框窗口

2.编写构造函数,这里背景色我使用不是透明,enable=true,并且使用setResizeable开启了可改变大小的功能,后面的4个数字窗口的四个边界padding,当鼠标在这个padding中,那么就鼠标就变成缩放的指针图标并且开启缩放功能。

FramelessWindow实现qt无边框窗口

3.一般来说我们想要窗口可以随意拖拽,但是去掉系统的标题栏后拖拽功能也需要我们自己实现,FramelessWindow已经帮我们实现了该功能。使用setTitleBar函数将我们想要可以拖拽的控件添加进去,即可实现鼠标拖拽。

QFrame* MainWidget::createHeader()
{
	QFrame* header = new QFrame();
	header->setFixedHeight(36);
	QHBoxLayout* header_lyt = new QHBoxLayout();
	header_lyt->setContentsMargins({ 2, 2, 2, 2 });
	header->setLayout(header_lyt);

	QFrame* menu_bar_frame = new QFrame();
	QHBoxLayout* menu_bar_lyt = new QHBoxLayout();
	menu_bar_lyt->setContentsMargins({ 0, 0, 0, 0 });
	QLabel* logo = new QLabel();
	logo->setFixedSize({ 24, 24 });
	QPixmap* pixmap = new QPixmap("./resources/icons/algorithm_icon.png");
	pixmap->scaled(logo->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
	logo->setPixmap(*pixmap);

	QPushButton* button = new QPushButton(u8"文件(F)");
	QMenu* menu = new QMenu();
	menu->addAction("Option 1");
	menu->addAction("Option 2");
	menu->addAction("Option 3"); 
	button->setMenu(menu);
	button->setStyleSheet("QPushButton::menu-indicator{image:none}");
	QFrame* menu_frame = new QFrame();
	QHBoxLayout* menu_frame_lyt = new QHBoxLayout();
	menu_frame_lyt->setContentsMargins(0, 0, 0, 0);
	menu_frame->setLayout(menu_frame_lyt);
	menu_frame_lyt->addWidget(button);
	menu_bar_lyt->addWidget(logo);
	menu_bar_lyt->addWidget(menu_frame);
	menu_bar_frame->setLayout(menu_bar_lyt);

	QFrame* op_bar = new QFrame();
	op_bar->setFixedWidth(100);
	QHBoxLayout* op_bar_lyt = new QHBoxLayout();
	op_bar_lyt->setContentsMargins({ 0, 0, 0, 0 });

	QToolButton* min_btn = new QToolButton();
	resize_btn = new QToolButton();
	QToolButton* close_btn = new QToolButton();

	QIcon min_icon("./resources/icons/min_icon.png");
	normal_icon = QIcon("./resources/icons/window_icon.png");
	max_icon = QIcon("./resources/icons/max_icon.png");
	QIcon close_icon("./resources/icons/close_icon.png");
	min_btn->setIcon(min_icon);
	resize_btn->setIcon(max_icon);
	close_btn->setIcon(close_icon);
	op_bar_lyt->addWidget(min_btn);
	op_bar_lyt->addWidget(resize_btn);
	op_bar_lyt->addWidget(close_btn);
	op_bar->setLayout(op_bar_lyt);

	header_lyt->addWidget(menu_bar_frame);
	header_lyt->addStretch(1);
	header_lyt->addWidget(op_bar);

	setTitlebar({ header, menu_frame, op_bar, menu_bar_frame, logo });


	connect(min_btn, &QPushButton::clicked, this, &MainWidget::onMinBtn);
	connect(resize_btn, &QPushButton::clicked, this, &MainWidget::onResizeBtn);
	connect(close_btn, &QPushButton::clicked, this, &MainWidget::onCloseBtn);



	return header;
}

4.去掉系统的标题栏后,窗口的最小化 最大化和关闭功能也需要我们自己实现。上述代码中的 min_btn resize_btn和close_btn分别实现了最小化按钮,最大化按钮和关闭按钮。他们的槽函数如下。

void MainWidget::onResizeBtn()
{
	if (this->isMaximized())
	{
		this->showNormal();
	}
	else
	{
		this->showMaximized();
	}
}
void MainWidget::onCloseBtn()
{
	close();
}
void MainWidget::resizeEvent(QResizeEvent* event)
{
	if (this->isMaximized())
	{
		resize_btn->setIcon(normal_icon);
	}
	else 
	{
		resize_btn->setIcon(max_icon);
	}
}

希望可以帮到大家。文章来源地址https://www.toymoban.com/news/detail-783438.html

到了这里,关于FramelessWindow实现qt无边框窗口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [Qt]FrameLessWindow实现调整大小、移动弹窗并具有Aero效果

    我们知道QWidget等设置了 this-setWindowFlags(Qt::FramelessWindowHint); 后无法移动和调整大小,但实际项目中是需要窗口能够调整大小的。所以以实现FrameLess弹窗调整大小及移动弹窗需求,并且在Windows 10上有Aero效果。 先看一下效果: 大部分参考这个github。然后自己修改了一下,因为

    2024年02月14日
    浏览(37)
  • 【Qt】Qt无边框窗口(鼠标点击自定义标题栏)可拖动

    隐藏掉标题栏后,默认情况下窗口无法被鼠标拖动的,需要自己处理鼠标事件,移动窗口达到拖动效果,但是又不想要鼠标点击整个窗口都可以拖动,只需要鼠标点击自定义的标题栏时可拖动 具体步骤如下: 类外初始化 通过鼠标点击事件,判断鼠标是否在标题栏,如果是,

    2024年02月12日
    浏览(45)
  • Qt窗口设置无边框不能移动,鼠标穿透后不能响应点击事件

      最近在做一个迷你小工具,准备干点不可描述的事情,想要短小强悍,始终在最顶层显示,同时不要自带的关闭按钮和边框,百度一下,发现是需要设置如下两个属性:   那么问题来了,这样的话一运行窗体就在正中间,而且无法拖动,就像这样   哪怕对于我这种

    2024年02月10日
    浏览(61)
  • Unity 设置无边框窗口

            最近在做窗口模式切换和设置分辨率,发现Unity只有设置窗口或全屏切换的API,没有设置无边框窗口的API。于是我就在在网上找到了一种设置方法。         注意,该方法仅限windows系统。         引用用windows的user32.dll库,调用库里的方法,来设置窗口无边框

    2024年04月08日
    浏览(43)
  • Unity发布PC 设置窗口 无边框(显示win任务栏),或全屏无边框

    设置win窗口无边框,就需要对获得Win的窗口信息,所以需要调用Win32的API [DllImport(“user32.dll”)] Win32 API //并不是很全,如果在此没找到想要的函数,可点击Win32 API查找 c#调用Win32详解 //下面脚本中 可以设置 除任务栏外无边框,也可以设置全屏无边框 运行第一次 界面还是会出

    2024年02月12日
    浏览(90)
  • Qt隐藏标题栏,鼠标实现窗口右下角放缩窗口

    重写鼠标移动事件就可以了,如果想实现其它位置的缩放,可以自己根据鼠标的位置来实现,思路都是一样的

    2024年02月13日
    浏览(54)
  • QT中将 子窗口添加到父窗口中,并实现子窗口随父窗口大小伸缩。

    在主窗口的 ui中 在MW ui中,整一个layout部件; 以及主窗口的其他部件一起都在MW(MainWindow)中,首先进行局部布局; 然后, 点击 MW ui再次进行 水平/垂直/..布局:这步重要,否则,子窗口就无法跟随主窗口一起进行缩放。 在 mainwindow.cpp嵌入子窗口 ui-xxxLayout-addWidget(子窗口

    2024年02月11日
    浏览(39)
  • QT如何实现不同窗口之间的通信

    方法: 用qt的信号与槽来实现   1,首先,对发送信号的窗口,自定义信号,和槽函数。   如:From1   signals:     void  SendData (QString s);  //信号   private slots: void  SendSlot (); //传递信号的函数,这个函数的主要功能就是,发送 SendData 这个信号     //槽函数实现 void Form1:: S

    2024年02月09日
    浏览(38)
  • Qt实现最小化窗口到托盘图标

    目录 前言: 1.先看效果图 2.大致思路以及实现流程 3.具体代码以及解释 4.总结 使用QT开发桌面软件,将软件最小化至托盘这样的功能的是比较常见的,今天自己实现一下这个功能,并进行记录总结。  主要功能就是当软件开始运行, 在系统托盘会自动出现一个关于本软件的

    2023年04月08日
    浏览(48)
  • QT`实现鼠标超时未点击,窗口自动关闭

    QT 实现鼠标超时未点击,窗口自动关闭 前言 有的时候我们需要某些窗口实现超时自动关闭,但是Qt窗口一般是多部件堆叠而成,如果常规处理,对每一个部件进行鼠标点击事件处理显然不太合理,我个人参考了网上前辈的处理方法,通过直接重新实现 QApplication::notify 函数来

    2024年02月10日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包