Qt-Qt无边框窗口实现拖动和改变大小(nativeEvent利用系统消息处理)
相关资料:
https://blog.csdn.net/qq_22642239/article/details/120565343
.pro
1 QT += core gui 2 3 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 4 5 CONFIG += c++11 6 7 # The following define makes your compiler emit warnings if you use 8 # any Qt feature that has been marked deprecated (the exact warnings 9 # depend on your compiler). Please consult the documentation of the 10 # deprecated API in order to know how to port your code away from it. 11 DEFINES += QT_DEPRECATED_WARNINGS 12 13 # You can also make your code fail to compile if it uses deprecated APIs. 14 # In order to do so, uncomment the following line. 15 # You can also select to disable deprecated APIs only up to a certain version of Qt. 16 #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 17 18 SOURCES += \ 19 main.cpp \ 20 mainwindow.cpp 21 22 HEADERS += \ 23 mainwindow.h 24 25 FORMS += \ 26 mainwindow.ui 27 28 # Default rules for deployment. 29 qnx: target.path = /tmp/$${TARGET}/bin 30 else: unix:!android: target.path = /opt/$${TARGET}/bin 31 !isEmpty(target.path): INSTALLS += target
main.cpp
1 #include "mainwindow.h" 2 3 #include <QApplication> 4 5 int main(int argc, char *argv[]) 6 { 7 QApplication a(argc, argv); 8 MainWindow w; 9 w.show(); 10 return a.exec(); 11 }
mainwindow.h
1 #ifndef MAINWINDOW_H 2 #define MAINWINDOW_H 3 4 #include <QMainWindow> 5 6 QT_BEGIN_NAMESPACE 7 namespace Ui { class MainWindow; } 8 QT_END_NAMESPACE 9 10 class MainWindow : public QMainWindow 11 { 12 Q_OBJECT 13 14 public: 15 MainWindow(QWidget *parent = nullptr); 16 ~MainWindow(); 17 18 protected: 19 //第一种方案是走windows自己的消息机制 20 virtual bool nativeEvent(const QByteArray &eventType, void *message, long *result); 21 private: 22 Ui::MainWindow *ui; 23 }; 24 #endif // MAINWINDOW_H
mainwindow.cpp
1 #include "mainwindow.h" 2 #include "ui_mainwindow.h" 3 4 #include <QMouseEvent> 5 #include <qt_windows.h> 6 const int g_nBorder = 4; 7 8 MainWindow::MainWindow(QWidget *parent) 9 : QMainWindow(parent) 10 , ui(new Ui::MainWindow) 11 { 12 ui->setupUi(this); 13 this->setWindowFlags(Qt::FramelessWindowHint); 14 setMouseTracking(true); 15 } 16 17 MainWindow::~MainWindow() 18 { 19 delete ui; 20 } 21 22 bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result) 23 { 24 MSG* pMsg = (MSG*)message; 25 switch (pMsg->message) 26 { 27 case WM_NCHITTEST: 28 { 29 QPoint pos = mapFromGlobal(QPoint(LOWORD(pMsg->lParam), HIWORD(pMsg->lParam))); 30 bool bHorLeft = pos.x() < g_nBorder; 31 bool bHorRight = pos.x() > width() - g_nBorder; 32 bool bVertTop = pos.y() < g_nBorder; 33 bool bVertBottom = pos.y() > height() - g_nBorder; 34 if (bHorLeft && bVertTop) 35 *result = HTTOPLEFT; 36 else if (bHorLeft && bVertBottom) 37 *result = HTBOTTOMLEFT; 38 else if (bHorRight && bVertTop) 39 *result = HTTOPRIGHT; 40 else if (bHorRight && bVertBottom) 41 *result = HTBOTTOMRIGHT; 42 else if (bHorLeft) 43 *result = HTLEFT; 44 else if (bHorRight) 45 *result = HTRIGHT; 46 else if (bVertTop) 47 *result = HTTOP; 48 else if (bVertBottom) 49 *result = HTBOTTOM; 50 else 51 return false; 52 return true; 53 } 54 break; 55 default: 56 break; 57 } 58 return QWidget::nativeEvent(eventType, message, result); 59 }
mainwindow.ui
1 <?xml version="1.0" encoding="UTF-8"?> 2 <ui version="4.0"> 3 <class>MainWindow</class> 4 <widget class="QMainWindow" name="MainWindow"> 5 <property name="geometry"> 6 <rect> 7 <x>0</x> 8 <y>0</y> 9 <width>800</width> 10 <height>600</height> 11 </rect> 12 </property> 13 <property name="windowTitle"> 14 <string>MainWindow</string> 15 </property> 16 <widget class="QWidget" name="centralwidget"/> 17 <widget class="QMenuBar" name="menubar"> 18 <property name="geometry"> 19 <rect> 20 <x>0</x> 21 <y>0</y> 22 <width>800</width> 23 <height>22</height> 24 </rect> 25 </property> 26 </widget> 27 <widget class="QStatusBar" name="statusbar"/> 28 </widget> 29 <resources/> 30 <connections/> 31 </ui>
作者:疯狂Delphi
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
欢迎关注我,一起进步!扫描下方二维码即可加我