Qt之自定义界面—1、实现无边框、可移动
最近需要写QT关于无边框的系统,打算在这里重新梳理一下无边框相关东西!
源代码后面章节才会上!本教程只会打造无边框界面和相关事件的处理。
无边框
设置窗口标志为无边框
setWindowFlags(Qt::FramelessWindowHint | windowFlags());
具体参考API吧!FramelessWindowHint参数为设置无边框窗口,windowFlags设置创建的窗口为最顶层。设置后窗口无法移动。
可移动
Qt事件
// 鼠标相对于窗体的位置 event->globalPos() - this->pos() void Widget::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { m_bPressed = true; m_point = event->pos(); } } // 若鼠标左键被按下,移动窗体位置 void Widget::mouseMoveEvent(QMouseEvent *event) { if (m_bPressed) move(event->globalPos() - m_point); } // 设置鼠标未被按下 void Widget::mouseReleaseEvent(QMouseEvent *event) { Q_UNUSED(event); m_bPressed = false; }
Win API
包含头文件与需要用到的库
#ifdef Q_OS_WIN #pragma comment(lib, "user32.lib") #include <qt_windows.h> #endif
发送系统消息,进行移动
void Widget::mousePressEvent(QMouseEvent *event) { #ifdef Q_OS_WIN if (ReleaseCapture()) SendMessage(HWND(winId()), WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0); event->ignore(); #else #endif }
有少部分情况下会出现报错,可以添加相关事件库文件解决!
#include <QtGui\QDragMoveEvent>
至于QT事件速度快还是WIN API速度快就看各自的应用环境和个人看法了!大家如果有心得也可以分享一下!