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 ...
随机推荐
- 用canvas画三角形的方法
<canvas id="favoriteRectangle" width="30" height="30"></canva ...
- python练习题-day3
1.有变量name="aleX leNb" 1)移除 name 变量对应的值两边的空格,并输出处理结果 print(name.strip()) 2)移除name变量左边的" ...
- 20180310 KindEditor 富文本编辑器
问题: 如何判断富文本编辑器文本内容非空 错误的办法,采用js 对控件本身的txt ID 号抓取获取值,由于加载富文本编辑器时,界面的ID 已经经过了修改或者可以用转换来说,所以抓取是无效果的. 需要 ...
- Delphi窗体置顶及失去焦点后取得焦点
unit u_FrmTopMostActive; interface uses Winapi.Windows; implementation // 窗体置顶 procedure SetXwForegr ...
- LVS小型系统架构搭建笔记
搭建环境说明 本次实现用到了6台节点,实现一个小型的Lvs负载调度 节点1客户端配置代表互联网用户 [root@centos7 network-scripts]# vi ifcfg-ens37 TYP ...
- 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 ...
- 微信支付-微信公众号支付,微信H5支付,微信APP支付,微信扫码支付
在支付前,如果使用第三方MVC框架,则使用重写模式,服务器也需要配置该项 if (!-e $request_filename){ rewrite ^/(.*)$ /index.php/$ last; ...
- Linux下安装zookeeper集群(奇数个)
1. 解压zookeeper压缩包 2. data里创建“myid”文件(命令touch myid),内容是1(命令 echo 1 >> myid) 3. zoo.cnf里配置dat ...
- SVM高斯核为何会将特征映射到无穷维?【转载】
转自:https://www.zhihu.com/question/35602879 1.问题: SVM中,对于线性不可分的情况下,我们利用升维,把低维度映射到到维度让数据变得“更可能线性可分”,为了 ...
- pom.xml实例
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...