QT 继承QWidget && 继承QDialog
工作项目中,利用到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的更多相关文章
- QT中QWidget、QDialog以及MainWindow的区别
参考 http://blog.csdn.net/u011619422/article/details/47311101 QT中QWidget.QDialog以及MainWindow的区别 QWidge ...
- QT中QWidget、QDialog QMainWindow
继承关系:在Qt中所有的类都有一个共同的基类QObject ,QWidget直接继承与QPaintDevice类,QDialog.QMainWindow.QFrame直接继承QWidget 类. QW ...
- 【Qt】QWidget、QDialog、QMainWindow的异同点【转】
简述 在分享所有基础知识之前,很有必要在这里介绍下常用的窗口-QWidget.QDialog.QMainWindow. 熟悉Qt的同学都应该知道,在新建Qt Widgets项目进行类信息选择时会碰到它 ...
- 【转】QT中QWidget、QDialog及QMainWindow的区别
QWidget类是所有用户界面对象的基类. 窗口部件是用户界面的一个基本单元:它从窗口系统接收鼠标.键盘和其它事件,并且在屏幕上绘制自己.每一个窗口部件都是矩形的,并且它们按Z轴顺序排列.一个窗口部件 ...
- QT中QWidget、QDialog及QMainWindow的区别
本文转自http://www.cnblogs.com/aqxin/archive/2011/05/23/2054156.html QWidget类是所有用户界面对象的基类. 窗口部件是用户界面的一个基 ...
- qt——QT中QWidget、QDialog及QMainWindow的区别
QWidget类是所有用户界面对象的基类. 窗口部件是用户界面的一个基本单元:它从窗口系统接收鼠标.键盘和其它事件,并且在屏幕上绘制自己.每一个窗口部件都是矩形的,并且它们按Z轴顺序排列.一个窗口部件 ...
- (转)QT中QWidget、QDialog及QMainWindow的区别
QWidget类是所有用户界面对象的基类. 窗口部件是用户界面的一个基本单元:它从窗口系统接收鼠标.键盘和其它事件,并且在屏幕上绘制自己.每一个窗口部件都是矩形的,并且它们按Z轴顺序排列.一个窗口部件 ...
- Qt中QWidget、QDialog和QMainWindow
QWidget 类是所有用户界面对象的基类.只有一个"页面" QMainWindow 是一个"窗口".含有菜单栏.状态栏.工具栏.停靠窗口.中心窗口 QDial ...
- QT类的继承结构
QT类的继承结构 QT的类 core 数据集合 QString 几何类 QPoint QSize QRectangle 系统类 QColor QFont QImage QIcon QCursor QB ...
随机推荐
- python面向对象的三大特性
一.继承 面向对象中的继承就是继承的类直接拥有被继承类的属性而不需要在自己的类体中重新再写一遍,其中被继承的类叫做父类.基类,继承的类叫做派生类.子类.在python3中如果不指定继承哪个类,默认就会 ...
- 强制禁用gitlab的双因子认证:Two-Factor Authentication
(一)问题描述: 此博客解决如下问题:禁用gitlab的双因子认证 禁用前,如图(此时,你在gitlab中什么也干不了) (二)思路分析: 百度了很多方法,都不可靠(如不可靠的说明:https://s ...
- 关于ARMv8另外几个问题
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/qianlong4526888/article/details/27510675 问题1:支持ARMv ...
- Python3学习之路~6.1 编程范式:面向过程 VS 面向对象
编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程,一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方式有很多种 ...
- 802.11n 连接的建议设置是什么?
这些是用于支持 802.11N 的英特尔无线适配器的默认设置. 这些建议采用的设置可以在英特尔® PROSet/ 无线软件的 高级菜单上找到. 属性 值 频带 2.4 的 802.11n 通道宽度 自 ...
- tp5Auth权限实现
原文地址:https://blog.csdn.net/qq_33257081/article/details/79137190 下面本人为大家讲解一下如何实现auth权限, 第一步,新建Auth.ph ...
- [css]table的拆分
https://blog.csdn.net/qq_35415600/article/details/70237433 <body> <table border="1&quo ...
- (转)Thread的中断机制(interrupt)
先看收集了别人的文章,全面的了解下java的中断: 中断线程 线程的thread.interrupt()方法是中断线程,将会设置该线程的中断状态位,即设置为true,中断的结果线程是死亡.还是等待新的 ...
- SQL简单操作
删除表数据,保留表结构: delete from employee 将删除所有的记录 delete from employee where lastname = 'May' 这条语句是从emplyee ...
- python-selenium无法调用浏览器的问题
一直有这个问题 问题:selenim不能调用浏览器 File "/Users/ligaijiang/PycharmProjects/Runoob/venv/lib/python3.7/sit ...