首页 > 其他分享 >Qt 写无边框窗口时,遇到的问题与解决方法

Qt 写无边框窗口时,遇到的问题与解决方法

时间:2025-01-07 10:34:35浏览次数:3  
标签:窗口 Qt MainWindow 30 pos 边框 screenRect event

一、无边框窗口问题/需求汇总:
1、 窗口最大化时闪屏、卡顿问题。
2、 鼠标左键可移动窗口,但只在窗口上下左右30以内区域可移动,其它地方不可移动。
3、 双屏幕时,窗口最大、向下还原需要在当前屏幕显示,不回到主屏幕。
4、 窗口正常显示时在屏幕中间区域。
5、 窗口最大化显示时,不能被任务栏给遮挡。

二、代码:

1、自定义MainWindow成员变量:
bool m_bPressed = false;      //移动窗口: 鼠标左键是否按下
QPoint m_pressPoint;          //移动窗口: 鼠标左键按下的坐标
bool m_bWindowNormal = true;  //true: 当前窗口Normal  false: 当前窗口Max

2、将窗口设置为无边框:
setWindowFlags(windowFlags() | Qt::FramelessWindowHint);

3、自定义MainWindow成员函数:
void MainWindow::mousePressEvent(QMouseEvent * event)
{
	QMainWindow::mouseMoveEvent(event);

    //解决:鼠标左键可移动窗口,但只在窗口上下左右30以内区域可移动,其它地方不可移动。
	if ((event->button() == Qt::LeftButton) 
		&& ((event->pos().y() < 30 && event->pos().y() > 0)                                      //上面区域30以内
			|| (event->pos().x() < 30 && event->pos().x() > 0)                                   //左面区域30以内
			|| (event->pos().x() < this->width() && event->pos().x() > this->width() - 30)       //右面区域30以内
			|| (event->pos().y() < this->height() && event->pos().y() > this->height() - 30)))   //下面区域30以内
	{
		m_bPressed = true;
		m_pressPoint = event->pos();
	}
	else
	{
		m_bPressed = false;
	}
}


void MainWindow::mouseReleaseEvent(QMouseEvent * event)
{
	QMainWindow::mouseReleaseEvent(event);

	if (m_bPressed)
	{
		m_bPressed = false;
	}
}


void MainWindow::mouseMoveEvent(QMouseEvent * event)
{
	QMainWindow::mouseMoveEvent(event);

	if (m_bPressed)
	{
		QPoint parentPoint = this->pos();

		parentPoint.setX(parentPoint.x() + event->x() - m_pressPoint.x());
		parentPoint.setY(parentPoint.y() + event->y() - m_pressPoint.y());

		this->move(parentPoint);
	}
}


void MainWindow::slotMinimizeToolButtonClicked()
{
	this->showMinimized();
}


void MainWindow::slotMaximizeToolButtonClicked()
{
	QDesktopWidget * deskTop = QApplication::desktop();
	//screenNumber获取软件所在屏幕Number,再配合其它代码,解决:双屏幕时,窗口最大、向下还原需要在当前屏幕显示,不回到主屏幕。
	int curMonitor = deskTop->screenNumber(this);
	//availableGeometry()获取屏幕可用部分Rect,解决:窗口最大化显示时,不能被任务栏给遮挡。
	QRect screenRect = deskTop->availableGeometry(curMonitor);

	if (m_bWindowNormal)
	{
		m_bWindowNormal = false;

		ui.maximizeToolButton->setIcon(QIcon(":/Title/Resources/images/RestoreDown.png"));
		ui.maximizeToolButton->setIconSize(ui.maximizeToolButton->size());
		ui.maximizeToolButton->setToolTip(TR("Restore Down"));

        //setFixedSize()固定窗口大小,解决:窗口最大化时闪屏、卡顿问题。
		this->setFixedSize(screenRect.width(), screenRect.height());
		this->move(screenRect.x(), screenRect.y());
	}
	else
	{
		m_bWindowNormal = true;

		ui.maximizeToolButton->setIcon(QIcon(":/Title/Resources/images/maximize.png"));
		ui.maximizeToolButton->setIconSize(ui.maximizeToolButton->size());
		ui.maximizeToolButton->setToolTip(TR("Maximize"));

		this->setFixedSize(1200, 840);
        
		//解决: 窗口正常显示时在屏幕中间区域。
		int x = (screenRect.width() - this->width()) / 2;
		int y = (screenRect.height() - this->height()) / 2;
		this->move(screenRect.x() + x, screenRect.y() + y);
	}
}


void MainWindow::slotClotureToolButtonClicked()
{
	QString title = TR("Information");
	QString strInfo = TR("Do you want to exit the system ?");

	ScanMessageBox messageBox;
	messageBox.SetTitle(title);
	messageBox.SetMessage(strInfo);
	auto code = messageBox.exec();
	if (code == QDialog::Accepted)
	{
		this->close();
	}
	

标签:窗口,Qt,MainWindow,30,pos,边框,screenRect,event
From: https://blog.csdn.net/weixin_44629261/article/details/144979771

相关文章

  • Qt 状态机使用说明
    一、前言1、状态机,有限状态机,FiniteStateMachine,简写FSM。2、状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。3、简单说,状态机就是负责执行各种状态的切换。4、Qt状态机通过Qt......
  • 智能工厂的设计软件 应用场景的一个例子: 为AI聊天工具添加一个知识系统 之21 项目主页
    本文要点基于RESTful风格设计一个“为AI聊天工具添加一个知识树系统”的项目主页本项目(为AI聊天工具添加一个知识树系统)的主页页面的三个页面版块(注:一个项目的基础版本,它明确给出建模限制what(where,how)并悬置模型本身(内部空出模型--内建,留给内部--待建+持续增强)同......
  • Qt天气预报系统界面关闭
    Qt天气预报系统界面关闭1、点击右上角x退出1.1添加控件1.2修改控件名字1.3编程实现控件功能2、鼠标右键退出2.1重写鼠标点击事件2.2添加定义2.3添加一个菜单2.3.1创建一个菜单指针2.3.2创建一个菜单对象2.3.3显示菜单2.3.4定义一个菜单退出动作2.3.5在当前鼠标位置显示......
  • chrome浏览器调试窗口如何设置深色背景主题
    前言大家好,我是小徐啊。chrome浏览器是我们常用的浏览器,在开发Java应用的时候,是经常需要用到的。而且,开发的时候,需要经常打开浏览器的调试模式,这个界面的默认主题是白色的,其实也可以设置成深色的主题,今天,小徐就来介绍下如何设置深色主题。如何设置深色主题首先,打开浏览器,然后鼠......
  • 如何通过代码修改网站的边框颜色?
    修改网站的边框颜色通常涉及CSS(层叠样式表)的调整。以下是详细的步骤和示例:定位CSS文件:找到网站的CSS文件,通常位于css目录下,文件名可能是style.css或类似的名称。使用文本编辑器:使用文本编辑器(如Notepad++、SublimeText、VSCode)打开CSS文件。找到或添加控制边框颜色......
  • win32汇编环境,窗口程序显示bmp图像文件
    ;运行效果;win32汇编环境,窗口程序显示bmp图像文件;显示的是一张尺寸236*318的bmp位图,及一张缩小为原来三分之一的位图;将代码复制进radasm软件里,直接编译就可以运行了;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>......
  • 使用MingW-w64 编译 64bit Qt5
    现在Qt官方提供的mingw编译器的预编译版本都是32bit的,如果想使用64bit的话需要自己手动进行编译。自己编译的话只需要下载mingw-w64编译器和Qt的源码,之前在官方Wiki上看到还需要Perl,实际测试发现没有Perl也可以正常编译。mingw-w64直接去mingw-w64官网下载就可以了,选择MingW-W64......
  • 遗留了很久的功能终于搞定/QTreeWidget自定义节点/添加删除修改分组
    一、前言说明这个功能看起来简单,实际上也确实简单,以前没搞的时候还以为很难,难点就是如何存储这个任意层级的树状列表信息,近期大环境经济很差,刚好有空把这个功能搞定,其实二维表格的方式存储这种任意层级树结构就可以,就是子节点需要指定父节点,父节点为空表示顶层节点,最开始还考虑搞......
  • 【PYQT】 一文掌握QlineEdit如何隐藏密码???
    @[toc]【PYQT】QlineEdit如何隐藏密码???【PYQT】QlineEdit如何隐藏密码???我们在设计登录页面的时候需要隐藏密码,不显示在QlineEdit中self.lineEdit.setEchoMode(QLineEdit.PasswordEchoOnEdit)QLineEdit的介绍QLineEdit:Normal显示输入的字符,这是默认设置。QLineEd......
  • Qt打包为exe文件
    个人学习笔记选择release进入项目文件夹,查看releas生成的文件releas文件路径进入release看到exe文件,但是无法执行将exe文件单独放到一个文件夹内选择MinGW用CD 进入存放exe文件的路径,输入下面指令cdJ:\C++\Qt\test4-3-1windeployqttest4-3.exe运行还是......