QT 繼承QWidget && 繼承QDialog


工作項目中,利用到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.

順序 選擇 循環 總結


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM