工作項目中,利用到Qt對話框,場景需求:
1. 一部分窗體需要繼承自QWidget
2. 一部分窗體需要繼承自QDialog
3. 兩者均需要去掉標題欄圖標,同時能夠自由拖動。
如果兩者分開繼承實現,會造成設置windowFlags、拖動功能部分代碼重復冗余,為了達到代碼復用的目的,利用模板類進行了封裝。
本地使用效果正常,特此備錄。
【1】頭文件
1 #ifndef _UPC_DIALOG_BASE_H 2 #define _UPC_DIALOG_BASE_H 3 4 #include <QDialog> 5 #include <QWidget> 6 #include <QPoint> 7 #include <QMouseEvent> 8 9 template <typename T> 10 class UPCBaseWidget : public T 11 { 12 public: 13 UPCBaseWidget(QWidget *parent = Q_NULLPTR); 14 virtual ~UPCBaseWidget(); 15 16 virtual int initialze() = 0; 17 18 protected: 19 void mousePressEvent(QMouseEvent *event); 20 void mouseMoveEvent(QMouseEvent *event); 21 void mouseReleaseEvent(QMouseEvent *event); 22 23 private: 24 bool m_bMoving; // 移動標志 25 QPoint m_pointPosition; // 移動位置 26 }; 27 28 /** 29 * @brief: 窗體基類。主要用於統一窗體風格和操作 30 * @author: Liuy 31 */ 32 33 class UPCCommonWidget : public UPCBaseWidget<QWidget> 34 { 35 Q_OBJECT 36 37 public: 38 UPCCommonWidget(QWidget *parent = Q_NULLPTR); 39 ~UPCCommonWidget(); 40 }; 41 42 43 /** 44 * @brief: 對話框基類。主要用於統一對話框風格和操作 45 * @author: Liuy 46 */ 47 class UPCCommonDialog : public UPCBaseWidget<QDialog> 48 { 49 Q_OBJECT 50 51 public: 52 UPCCommonDialog(QWidget *parent = Q_NULLPTR); 53 ~UPCCommonDialog(); 54 }; 55 56 #endif
【2】實現文件
1 #include "UPCDialogBase.h" 2 #include "UPCSoftphoneConst.h" 3 4 #include <QIcon> 5 #include <QApplication> 6 7 /* 8 * @brief: 構造函數 9 * @argument: QWidget * parent 10 */ 11 template <typename T> 12 UPCBaseWidget<T>::UPCBaseWidget(QWidget *parent) 13 : T(parent) 14 , m_bMoving(false) 15 { 16 // 設置系統圖標 17 setWindowIcon(QIcon(SYSTEM_ICON)); 18 // 設置關閉摧毀 19 setAttribute(Qt::WA_DeleteOnClose); 20 // 設置窗體背景為白色 21 QPalette palette; 22 palette.setColor(QPalette::Background, Qt::white); 23 setPalette(palette); 24 25 // 為了解決彈窗關閉后整個應用程序退出問題 26 QApplication::setQuitOnLastWindowClosed(false); 27 } 28 29 template <typename T> 30 UPCBaseWidget<T>::~UPCBaseWidget() 31 {} 32 33 /* 34 * @brief: 重寫鼠標按下事件處理過程 35 * @argument: QMouseEvent * event 36 * @return:void 37 */ 38 template <typename T> 39 void UPCBaseWidget<T>::mousePressEvent(QMouseEvent *event) 40 { 41 m_bMoving = true; 42 // 記錄下鼠標相對於窗口的位置 43 // event->globalPos() 鼠標按下時,鼠標相對於整個屏幕位置 44 // pos() 即:this->pos() 鼠標按下時,窗口相對於整個屏幕位置 45 m_pointPosition = event->globalPos() - pos(); 46 return T::mousePressEvent(event); 47 } 48 49 /* 50 * @brief: 重寫鼠標移動事件處理過程 51 * @argument: QMouseEvent * event 52 * @return:void 53 */ 54 template <typename T> 55 void UPCBaseWidget<T>::mouseMoveEvent(QMouseEvent *event) 56 { 57 // (event->buttons() && Qt::LeftButton)按下是左鍵 58 // 鼠標移動事件需要移動窗口,窗口移動到哪里呢?就是要獲取鼠標移動中,窗口在整個屏幕的坐標,然后move到這個坐標,怎么獲取坐標? 59 // 通過事件event->globalPos()知道鼠標坐標,鼠標坐標減去鼠標相對於窗口位置,就是窗口在整個屏幕的坐標 60 if (m_bMoving && 61 (event->buttons() && Qt::LeftButton) && 62 (event->globalPos() - m_pointPosition).manhattanLength() > QApplication::startDragDistance()) 63 { 64 move(event->globalPos() - m_pointPosition); 65 m_pointPosition = event->globalPos() - pos(); 66 } 67 68 return T::mouseMoveEvent(event); 69 } 70 71 /* 72 * @brief: 重寫鼠標釋放事件處理過程 73 * @argument: QMouseEvent * event 74 * @return:void 75 */ 76 template <typename T> 77 void UPCBaseWidget<T>::mouseReleaseEvent(QMouseEvent *event) 78 { 79 m_bMoving = false; 80 return T::mouseReleaseEvent(event); 81 } 82 83 /* 84 * @brief: 構造函數 85 * @argument: QWidget * parent 86 */ 87 UPCCommonWidget::UPCCommonWidget(QWidget *parent) 88 : UPCBaseWidget<QWidget>(parent) 89 { 90 // 去掉任務欄圖標 && 去掉標題欄 && 最上層顯示 91 setWindowFlags(Qt::Tool | Qt::FramelessWindowHint | Qt::WindowMinimizeButtonHint | Qt::WindowStaysOnTopHint); 92 } 93 94 UPCCommonWidget::~UPCCommonWidget() 95 {} 96 97 /* 98 * @brief: 構造函數 99 * @argument: QWidget * parent 100 */ 101 UPCCommonDialog::UPCCommonDialog(QWidget *parent) 102 : UPCBaseWidget<QDialog>(parent) 103 { 104 // 去掉標題欄 && 最上層顯示 105 setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinimizeButtonHint | Qt::WindowStaysOnTopHint); 106 } 107 108 UPCCommonDialog::~UPCCommonDialog() 109 {}
Good Good Study, Day Day Up.
順序 選擇 循環 總結