工作项目中,利用到Qt对话框,场景需求:

1. 一部分窗体需要继承自QWidget

2. 一部分窗体需要继承自QDialog

3. 两者均需要去掉标题栏图标,同时能够自由拖动。

如果两者分开继承实现,会造成设置windowFlags、拖动功能部分代码重复冗余,为了达到代码复用的目的,利用模板类进行了封装。

本地使用效果正常,特此备录。

【1】头文件

 #ifndef _UPC_DIALOG_BASE_H
#define _UPC_DIALOG_BASE_H #include <QDialog>
#include <QWidget>
#include <QPoint>
#include <QMouseEvent> template <typename T>
class UPCBaseWidget : public T
{
public:
UPCBaseWidget(QWidget *parent = Q_NULLPTR);
virtual ~UPCBaseWidget(); virtual int initialze() = ; protected:
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event); private:
bool m_bMoving; // 移动标志
QPoint m_pointPosition; // 移动位置
}; /**
* @brief: 窗体基类。主要用于统一窗体风格和操作
* @author: Liuy
*/ class UPCCommonWidget : public UPCBaseWidget<QWidget>
{
Q_OBJECT public:
UPCCommonWidget(QWidget *parent = Q_NULLPTR);
~UPCCommonWidget();
}; /**
* @brief: 对话框基类。主要用于统一对话框风格和操作
* @author: Liuy
*/
class UPCCommonDialog : public UPCBaseWidget<QDialog>
{
Q_OBJECT public:
UPCCommonDialog(QWidget *parent = Q_NULLPTR);
~UPCCommonDialog();
}; #endif

【2】实现文件

 #include "UPCDialogBase.h"
#include "UPCSoftphoneConst.h" #include <QIcon>
#include <QApplication> /*
* @brief: 构造函数
* @argument: QWidget * parent
*/
template <typename T>
UPCBaseWidget<T>::UPCBaseWidget(QWidget *parent)
: T(parent)
, m_bMoving(false)
{
// 设置系统图标
setWindowIcon(QIcon(SYSTEM_ICON));
// 设置关闭摧毁
setAttribute(Qt::WA_DeleteOnClose);
// 设置窗体背景为白色
QPalette palette;
palette.setColor(QPalette::Background, Qt::white);
setPalette(palette); // 为了解决弹窗关闭后整个应用程序退出问题
QApplication::setQuitOnLastWindowClosed(false);
} template <typename T>
UPCBaseWidget<T>::~UPCBaseWidget()
{} /*
* @brief: 重写鼠标按下事件处理过程
* @argument: QMouseEvent * event
* @return:void
*/
template <typename T>
void UPCBaseWidget<T>::mousePressEvent(QMouseEvent *event)
{
m_bMoving = true;
// 记录下鼠标相对于窗口的位置
// event->globalPos() 鼠标按下时,鼠标相对于整个屏幕位置
// pos() 即:this->pos() 鼠标按下时,窗口相对于整个屏幕位置
m_pointPosition = event->globalPos() - pos();
return T::mousePressEvent(event);
} /*
* @brief: 重写鼠标移动事件处理过程
* @argument: QMouseEvent * event
* @return:void
*/
template <typename T>
void UPCBaseWidget<T>::mouseMoveEvent(QMouseEvent *event)
{
// (event->buttons() && Qt::LeftButton)按下是左键
// 鼠标移动事件需要移动窗口,窗口移动到哪里呢?就是要获取鼠标移动中,窗口在整个屏幕的坐标,然后move到这个坐标,怎么获取坐标?
// 通过事件event->globalPos()知道鼠标坐标,鼠标坐标减去鼠标相对于窗口位置,就是窗口在整个屏幕的坐标
if (m_bMoving &&
(event->buttons() && Qt::LeftButton) &&
(event->globalPos() - m_pointPosition).manhattanLength() > QApplication::startDragDistance())
{
move(event->globalPos() - m_pointPosition);
m_pointPosition = event->globalPos() - pos();
} return T::mouseMoveEvent(event);
} /*
* @brief: 重写鼠标释放事件处理过程
* @argument: QMouseEvent * event
* @return:void
*/
template <typename T>
void UPCBaseWidget<T>::mouseReleaseEvent(QMouseEvent *event)
{
m_bMoving = false;
return T::mouseReleaseEvent(event);
} /*
* @brief: 构造函数
* @argument: QWidget * parent
*/
UPCCommonWidget::UPCCommonWidget(QWidget *parent)
: UPCBaseWidget<QWidget>(parent)
{
// 去掉任务栏图标 && 去掉标题栏 && 最上层显示
setWindowFlags(Qt::Tool | Qt::FramelessWindowHint | Qt::WindowMinimizeButtonHint | Qt::WindowStaysOnTopHint);
} UPCCommonWidget::~UPCCommonWidget()
{} /*
* @brief: 构造函数
* @argument: QWidget * parent
*/
UPCCommonDialog::UPCCommonDialog(QWidget *parent)
: UPCBaseWidget<QDialog>(parent)
{
// 去掉标题栏 && 最上层显示
setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinimizeButtonHint | Qt::WindowStaysOnTopHint);
} UPCCommonDialog::~UPCCommonDialog()
{}

Good Good Study, Day Day Up.

顺序 选择 循环 总结

QT 继承QWidget && 继承QDialog的更多相关文章

  1. QT中QWidget、QDialog以及MainWindow的区别

    参考 http://blog.csdn.net/u011619422/article/details/47311101 QT中QWidget.QDialog以及MainWindow的区别 QWidge ...

  2. QT中QWidget、QDialog QMainWindow

    继承关系:在Qt中所有的类都有一个共同的基类QObject ,QWidget直接继承与QPaintDevice类,QDialog.QMainWindow.QFrame直接继承QWidget 类. QW ...

  3. 【Qt】QWidget、QDialog、QMainWindow的异同点【转】

    简述 在分享所有基础知识之前,很有必要在这里介绍下常用的窗口-QWidget.QDialog.QMainWindow. 熟悉Qt的同学都应该知道,在新建Qt Widgets项目进行类信息选择时会碰到它 ...

  4. 【转】QT中QWidget、QDialog及QMainWindow的区别

    QWidget类是所有用户界面对象的基类. 窗口部件是用户界面的一个基本单元:它从窗口系统接收鼠标.键盘和其它事件,并且在屏幕上绘制自己.每一个窗口部件都是矩形的,并且它们按Z轴顺序排列.一个窗口部件 ...

  5. QT中QWidget、QDialog及QMainWindow的区别

    本文转自http://www.cnblogs.com/aqxin/archive/2011/05/23/2054156.html QWidget类是所有用户界面对象的基类. 窗口部件是用户界面的一个基 ...

  6. qt——QT中QWidget、QDialog及QMainWindow的区别

    QWidget类是所有用户界面对象的基类. 窗口部件是用户界面的一个基本单元:它从窗口系统接收鼠标.键盘和其它事件,并且在屏幕上绘制自己.每一个窗口部件都是矩形的,并且它们按Z轴顺序排列.一个窗口部件 ...

  7. (转)QT中QWidget、QDialog及QMainWindow的区别

    QWidget类是所有用户界面对象的基类. 窗口部件是用户界面的一个基本单元:它从窗口系统接收鼠标.键盘和其它事件,并且在屏幕上绘制自己.每一个窗口部件都是矩形的,并且它们按Z轴顺序排列.一个窗口部件 ...

  8. Qt中QWidget、QDialog和QMainWindow

    QWidget 类是所有用户界面对象的基类.只有一个"页面" QMainWindow 是一个"窗口".含有菜单栏.状态栏.工具栏.停靠窗口.中心窗口 QDial ...

  9. QT类的继承结构

    QT类的继承结构 QT的类 core 数据集合 QString 几何类 QPoint QSize QRectangle 系统类 QColor QFont QImage QIcon QCursor QB ...

随机推荐

  1. mysql之索引简介

    索引分类 mysql在存储数据时,是按着主键的顺序存储的.主键索引是物理索引,其他索引都是逻辑索引. 普通索引 普通索引是最基本的索引,没有任何限制的索引,普通索引列的数据可以重复.其唯一的任务就是加 ...

  2. java 数组(一)

    java的数组操作和C#是一样的,不多说明. public class ArrayDemo{ public static void main(String[] args){ //数组的定义 数据类型[ ...

  3. java各版本简单对比

    1995.5 Oak ——>java1.0 提出 write once run anywhere 1996.1 jdk1.0  jvm Sun Classic VM 1997.2 JDK1.1 ...

  4. du 查看文件大小

    [root@localhost ~]# du -sh /etc # 查看目录下所有文件大小 [root@localhost ~]# du -sh * # 查看所有文件大小

  5. 计算机网络 0.初识Internet与TCP/IP协议

    互联网,即因特网,Internet.互联网是一个世界范围的计算机网络.连接了世界上无数的计算设备,这些计算设备为PC.基于Linux的工作站,serverservers等等. 这些设备依据其作用不同可 ...

  6. what' the python之面向对象(进阶)

    面向对象的知识点补充(进阶版) classmethod和staticmethod:这两个函数的用途就是可以不用实例化对象就可以调用方法 class Classmethod_Demo(): role = ...

  7. 细细探究MySQL Group Replicaiton — 配置维护故障处理全集(转)

    如果转载,请注明博文来源: www.cnblogs.com/xinysu/   ,版权归 博客园 苏家小萝卜 所有.望各位支持! 

  8. C# 线程池ThreadPool的用法简析

    https://blog.csdn.net/smooth_tailor/article/details/52460566 什么是线程池?为什么要用线程池?怎么用线程池? 1. 什么是线程池? .NET ...

  9. 对Python源码加密及反编译前后对比

    关于python的加密 目前软件开发商对 Python 加密时可能会有两种形式,一种是对python转成的exe进行 保护,另一种是直接对.py或者.pyc文件进行保护,下面将列举两种形式的保护流程. ...

  10. oracle新建表空间与用户

    例如:创建用户 cwbase1_9999 密码 gxtest  表空间 cwdata1 sqlplus / as sysdba 运行sql create tablespace cwdata1 logg ...