使用FramelessWindow实现qt无边框界面

2 篇文章 0 订阅
本文介绍了如何在Qt项目中添加和使用FramelessWindow.h头文件,实现无边框窗口,包括自定义标题栏、拖拽功能以及最小化、最大化和关闭按钮的实现。
摘要由CSDN通过智能技术生成

FramelessWindow.h文件链接

添加FramelessWindow.h头文件

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

简单浏览framelessWindow代码

我们发现FramelessWindow是一个继承模板参数的类模板。
请添加图片描述

并且看一下构造函数

请添加图片描述

简单实现

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

这里我使用QFrame

请添加图片描述

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

请添加图片描述

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);

	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_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);
	}
}

希望可以帮到大家

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Qt实现边框放大缩小拖动界面可以使用以下方法: 1. 设置窗口无边框 使用setWindowFlags()函数设置窗口无边框,示例代码如下: ```python self.setWindowFlags(Qt.FramelessWindowHint) ``` 2. 实现窗口放大缩小 使用QDesktopWidget类获取屏幕的宽度和高度,然后通过setGeometry()函数设置窗口的大小,示例代码如下: ```python desktop = QApplication.desktop() width = desktop.width() height = desktop.height() self.setGeometry(0, 0, width, height) ``` 3. 实现窗口拖动 重载鼠标事件函数,实现窗口的拖动功能。在mousePressEvent()函数中记录鼠标按下时的位置,然后在mouseMoveEvent()函数中计算鼠标移动的距离,将窗口移动到相应的位置,示例代码如下: ```python def mousePressEvent(self, event): self.mouse_pos = event.globalPos() - self.pos() def mouseMoveEvent(self, event): self.move(event.globalPos() - self.mouse_pos) ``` 完整代码示例: ```python from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtCore import Qt class MainWindow(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setWindowFlags(Qt.FramelessWindowHint) self.setGeometry(0, 0, 800, 600) self.show() def mousePressEvent(self, event): self.mouse_pos = event.globalPos() - self.pos() def mouseMoveEvent(self, event): self.move(event.globalPos() - self.mouse_pos) if __name__ == '__main__': app = QApplication([]) window = MainWindow() app.exec_() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值