工作项目中,利用到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. 用canvas画三角形的方法

    <canvas id="favoriteRectangle" width="30" height="30"></canva ...

  2. python练习题-day3

    1.有变量name="aleX leNb" 1)移除 name 变量对应的值两边的空格,并输出处理结果 print(name.strip()) 2)移除name变量左边的" ...

  3. 20180310 KindEditor 富文本编辑器

    问题: 如何判断富文本编辑器文本内容非空 错误的办法,采用js 对控件本身的txt ID 号抓取获取值,由于加载富文本编辑器时,界面的ID 已经经过了修改或者可以用转换来说,所以抓取是无效果的. 需要 ...

  4. Delphi窗体置顶及失去焦点后取得焦点

    unit u_FrmTopMostActive; interface uses Winapi.Windows; implementation // 窗体置顶 procedure SetXwForegr ...

  5. LVS小型系统架构搭建笔记

    搭建环境说明 本次实现用到了6台节点,实现一个小型的Lvs负载调度 节点1客户端配置代表互联网用户 [root@centos7 network-scripts]# vi ifcfg-ens37 TYP ...

  6. 008-docker-安装-tomcat:8.5.38-jre8

    1.搜索镜像 docker search tomcat 2.拉取合适镜像 查询tags:https://hub.docker.com/ docker pull tomcat:8.5.38-jre8 d ...

  7. 微信支付-微信公众号支付,微信H5支付,微信APP支付,微信扫码支付

    在支付前,如果使用第三方MVC框架,则使用重写模式,服务器也需要配置该项 if (!-e $request_filename){ rewrite ^/(.*)$ /index.php/$ last; ...

  8. Linux下安装zookeeper集群(奇数个)

    1.  解压zookeeper压缩包 2.  data里创建“myid”文件(命令touch myid),内容是1(命令 echo 1 >> myid) 3.  zoo.cnf里配置dat ...

  9. SVM高斯核为何会将特征映射到无穷维?【转载】

    转自:https://www.zhihu.com/question/35602879 1.问题: SVM中,对于线性不可分的情况下,我们利用升维,把低维度映射到到维度让数据变得“更可能线性可分”,为了 ...

  10. pom.xml实例

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...