在本文中,我们将深入探讨如何使用Qt框架在Windows 11操作系统上实现一个无边框窗口,并添加类似于系统原生的“最大化”功能,利用Win11的Snap Layout特性。Qt是一个跨平台的C++图形用户界面应用程序开发框架,它为开发者提供了丰富的API和工具,使得构建高效、美观的应用程序变得简单。 让我们了解无边框窗口。在Qt中,我们可以创建一个没有系统标题栏和边框的窗口,这通常通过继承`QMainWindow`或`QWidget`类并重写其行为来实现。无边框窗口可以提供更自定义的外观和交互方式,但同时也需要我们自己实现拖动、缩放等基本操作。 为了创建无边框窗口,我们需要设置窗口的`setWindowFlags()`,例如: ```cpp setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint); ``` 这段代码将禁用窗口的边框,同时保留系统菜单和最小化/最大化按钮。 接着,我们要实现窗口的拖动功能。这通常通过处理鼠标移动事件来完成,获取到鼠标的相对位置并更新窗口的位置: ```cpp void MyWidget::mouseMoveEvent(QMouseEvent *event) { if (event->buttons() & Qt::LeftButton && m_dragPos != event->pos()) { move(mapToGlobal(event->pos()) - m_dragPos); m_dragPos = event->pos(); } } void MyWidget::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { m_dragPos = event->globalPos() - frameGeometry().topLeft(); } } ``` 对于最大化功能,由于我们已经移除了系统边框,所以不能直接使用`showMaximized()`。我们需要模仿Win11的Snap Layout功能。在Windows 11中,用户可以通过拖动窗口到屏幕边缘或使用快捷键触发Snap Layout,显示一组预设的窗口布局选项。我们可以通过`QWindow::windowStateChanged`信号来监听窗口状态的变化,并在窗口最大化时模拟Snap Layout效果。 我们需要引入Windows API,这通常通过`#include `来完成。然后,我们可以在窗口最大化时调用以下API: ```cpp #include void MyWidget::maximizeButtonClicked() { // 获取当前屏幕的Rect MONITORINFO monitorInfo; monitorInfo.cbSize = sizeof(MONITORINFO); GetMonitorInfo(MonitorFromWindow(handle(), MONITOR_DEFAULTTONEAREST), &monitorInfo); // 设置窗口位置和大小以填充整个屏幕 SetWindowPos(handle(), HWND_TOP, monitorInfo.rcMonitor.left, monitorInfo.rcMonitor.top, monitorInfo.rcMonitor.right - monitorInfo.rcMonitor.left, monitorInfo.rcMonitor.bottom - monitorInfo.rcMonitor.top, SWP_NOZORDER | SWP_NOACTIVATE); } ``` 此外,为了实现悬浮的“最大化”按钮,我们可以自定义一个QGraphicsView或QLabel,包含一个图标,并在其上响应鼠标点击事件。当点击这个按钮时,调用`maximizeButtonClicked()`函数。 在Qt中,实现这样的功能可能需要对Windows API有一定的了解,以及熟练运用Qt的事件处理机制。通过以上步骤,我们就可以在Win11环境下创建一个具有无边框、自定义最大化功能的Qt应用了。这不仅能够提供独特的用户体验,还能够充分利用Win11的新特性。在实际开发中,你还可以根据需要进一步定制窗口的外观和行为,比如添加自定义的拖动样式、调整按钮动画等。
2025-04-11 10:52:12 13KB win11
1
Qt中经常会用到提示框,用于交互操作!QMessageBox是被大多数人用到的,用起来是很方便,但是控件类型、大小、布局、样式、往往不是开发者想要的。本实例实现的Notification控件,是一种悬浮在角落的通知提醒框
2024-11-11 15:40:12 12KB
1
LabVIEW系统自带的对话框,弹出后,只能点击ok或者cancel.不能对其他VI进行操作。自己编写一个对话框,这样在弹出后,仍然可以对其他VI进行操作,就方便调试其他VI了,因为在此时其他VI的参数会影响到当前的效果。
2024-10-24 21:48:05 50.35MB LabVIEW
1
开发Winform程序的时,经常会用到等待窗口(如网络通讯、数据库操作等一些耗时操作),这样可以可以有更好的体验。     本例程等待窗口可以传入显示的问题动态更新显示的文字内容,添加了窗口句柄方法,可以在线程操作中,解决模态窗口ShowDialog()时不起作用还能继续操作地步控件的问题。 另外添加了近百种loading加载gif动图显示,可满足各种需求。
2024-08-29 15:33:31 1.85MB winform loading 等待窗口
1
qt QAxWidget和QAxObject调用第三方应用(IE和远程访问桌面,Word,Excel),可以弹出单独界面或者嵌入到QT界面上面,QAxWidget 和 QAxObject的区别,是QAxWidget可以弹出界面。本工程有访问网页和远程连接桌面第三方应用;还有Word 和Excel 等操相关作功能。
2024-07-03 09:13:08 1.95MB QAxWidget QAxObject Word和Excel
1
在移动端app非常常用的控件, 使用简单, 支持多种方向的箭头. 弹出视图. (类似于微信右上角的弹出视图, 网易云音乐的弹出视图)
2024-03-01 17:41:57 117KB 弹出视图
1
VB6多风格弹出菜单控件源码。使用此控件,可以方便地创建各种美观的弹出式菜单。支持添加菜单侧边栏,修改菜单的颜色等。
2024-02-04 15:05:49 313KB
1
当鼠标指向某一个连接或标签时,就会显示相应的详细信息,鼠标移开时,信息就消失
2024-01-25 07:02:19 3KB
1
在wince下,VS2005的C#开发的控件statusbar没有状态栏分栏,所以调用API来设置状态栏的分栏,Text的显示。 同时包含用API调用软件弹出的实现 环境:VS2005 c#,智能设备(wince),在wince5或6下测试OK
2023-12-27 05:01:40 116KB
1
pyqt5使用QGraphicsView做弹出菜单
2023-12-26 09:36:39 14KB pyqt5 Python QGraphicsView
1