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.

顺序 选择 循环 总结

posted @ 2018-10-12 18:01  kaizenly  阅读(5589)  评论(0编辑  收藏  举报
打赏