当前位置: 首页 > article >正文

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

一、无边框窗口问题/需求汇总:
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();
	}
	

http://www.kler.cn/a/471172.html

相关文章:

  • MySQL和Hive中的行转列、列转行
  • 23.行号没有了怎么办 滚动条没有了怎么办 C#例子
  • 部署:上传项目代码 配置数据库
  • 【CPU】页表项和叶子表项(个人草稿)
  • opencv CV_TM_SQDIFF未定义标识符
  • 基于Matlab的变压器仿真模型建模方法(13):单相升压自耦变压器的等效电路和仿真模型
  • Vue 环境配置与项目创建指南
  • Linux-Ubuntu之SPI串行通信陀螺仪和加速度计
  • Java Web开发进阶——Spring Boot与Spring Data JPA
  • 【2025最新】网络安全攻防实战:护网行动经验与策略解析
  • 120.Jenkins里的Pipeline Script
  • 【Linux网络编程】第二十一弹---深入解析I/O多路转接技术之poll函数:优势、缺陷与实战代码
  • git①111
  • HDFS架构原理
  • TextMeshPro保存偏移数据
  • React18实现账单管理项目(三):日期分组与图标适配
  • 请求是如何通过k8s service 路由到对应的pod
  • Express 加 sqlite3 写一个简单博客
  • Oracle SQL子查询实例
  • UE4_用户控件_4_Widgets嵌套Widgets构建复杂系统
  • VLMs之Agent之CogAgent:CogAgent的简介、安装和使用方法、案例应用之详细攻略
  • Yolov8训练方式以及C#中读取yolov8+onnx模型进行目标检测.NET 6.0
  • 分布式与集群
  • 基于SpringBoot+Vue的考研百科网站
  • UG NX二次开发(C++)-UFun函数-按照特定方向提取轮廓线
  • el-table拖拽表格