一、前言
我们使用QT进行界面开发时,可能会遇到需要将窗口置顶的情况。最常见的就是,需要制作一个悬浮工具栏,悬浮菜单,甚至是悬浮的画板。这就意味这我们需要将这个窗口置顶于“系统”以及我们自己“软件”的窗口之上。
其实实现的方法很简单,就是在创建这个窗口类的时候,在构造函数中的加一个Qt::WindowFlags 枚举标识 Qt::WindowStaysOnTopHint
Qt::WindowStaysOnBottomHint 值为:0x04000000
Informs the window system that the window should stay on bottom of all other windows
二、示例代码
Win2::Win2(QWidget *parent) : QWidget{parent} { this->setWindowFlags(Qt::Widget | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint); new QLabel("Win2 =================", this); }
或者
Widget::Widget(QWidget *parent) : QWidget(parent,Qt::Widget | Qt::WindowStaysOnTopHint) , ui(new Ui::Widget) { ui->setupUi(this); }
三、补充说明
如果以上实现不太兼容,可以考虑 Windows 的原生接口。
步骤1,在工程文件pro中添加库:
win{ LIBS += -lUser32 }
步骤2,为了保证窗口始终置顶,这里我在窗口中开启一个定时器去执行以下函数
cpp 中添加如下代码:
#ifdef Q_OS_WIN SetWindowPos((HWND)this->winId(), HWND_TOPMOST, this->x(), this->y(), this->width(), this->height(), SWP_SHOWWINDOW); SetWindowLong((HWND)this->winId(), GWL_EXSTYLE, GetWindowLong((HWND)this->winId(), GWL_EXSTYLE) | WS_EX_NOACTIVATE); #endif
h 中添加如下代码:
#ifdef Q_OS_WIN #include "Windows.h" #endif
四、窗口透明
setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint);//去掉标题栏 setAttribute(Qt::WA_TranslucentBackground, true);//设置窗口背景透明