Qt(C++)移除Windows窗口默认标题栏同时保留原生边框的实现问题
解决方案
方案1:保留Windows原生窗口边框(仅Windows平台有效)
该方案可以完全保留系统默认的原生边框样式,同时移除标题栏,不需要自行绘制边框。
操作步骤
- 先在项目的
.pro文件中添加Windows系统库链接:
LIBS += user32.lib
- 修改
launcher.h,添加原生事件处理函数声明:
#pragma once #include <QtWidgets/QMainWindow> #include <QMouseEvent> #include <QPoint> #include <windows.h> #include "ui_launcher.h" class launcher : public QMainWindow { Q_OBJECT public: launcher(QWidget* parent = Q_NULLPTR); protected: bool nativeEvent(const QByteArray& eventType, void* message, long* result) override; void mousePressEvent(QMouseEvent* eventVar); void mouseMoveEvent(QMouseEvent* eventVar); private: Ui::launcherClass ui; int mouseClickX = 0; int mouseClickY = 0; };
- 修改
launcher.cpp,实现原生事件处理逻辑,拦截系统非客户区计算消息,移除标题栏区域、保留边框区域:
#include "launcher.h" launcher::launcher(QWidget* parent) : QMainWindow(parent) { ui.setupUi(this); setWindowFlags(Qt::Window | Qt::CustomizeWindowHint | Qt::MSWindowsFixedSizeDialogHint); } bool launcher::nativeEvent(const QByteArray& eventType, void* message, long* result) { MSG* msg = static_cast<MSG*>(message); if (msg->message == WM_NCCALCSIZE) { *result = 0; return true; } return QMainWindow::nativeEvent(eventType, message, result); } void launcher::mousePressEvent(QMouseEvent* eventVar) { mouseClickX = eventVar->x(); mouseClickY = eventVar->y(); } void launcher::mouseMoveEvent(QMouseEvent* eventVar) { move(eventVar->globalX() - mouseClickX, eventVar->globalY() - mouseClickY); }
方案2:自定义绘制边框(跨平台通用)
如果需要跨平台使用,或者想要自定义边框的颜色、粗细,可以直接自行绘制边框,不依赖系统原生样式:
操作步骤
- 在构造函数中添加开启样式表绘制的属性:
launcher::launcher(QWidget* parent) : QMainWindow(parent) { ui.setupUi(this); setWindowFlags(Qt::Window | Qt::CustomizeWindowHint | Qt::MSWindowsFixedSizeDialogHint); setAttribute(Qt::WA_StyledBackground); }
- 通过样式表自定义边框样式,示例为设置1px灰色边框:
// 可写在构造函数中,也可在Qt设计师界面设置样式表 setStyleSheet("QMainWindow {border: 1px solid #707070; background-color: #ffffff;}");
如果需要更复杂的边框效果,也可重写paintEvent函数自行绘制。
原问题原因说明
之前出现白色细边框是因为Qt::CustomizeWindowHint标志会禁用Windows系统对窗口非客户区(包含标题栏、边框)的默认绘制逻辑,Qt会自动回退绘制一个最简单的白色边框,因此不会显示原生的系统边框样式。
内容的提问来源于stack exchange,提问作者Louis Bernard
相关产品推荐
相关产品推荐

