自定义Qt对话框
时间:2022-07-22
本文章向大家介绍自定义Qt对话框,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
今天就简单简单写个自定义对话框分享给大家。
演示
上代码!
- 自定义对话框的使用:
#include <QApplication>
#include <QDebug>
#include "Dialog.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog dialog;
dialog.resize(380, 240);
dialog.setText(QStringLiteral("Hello world! @Qt君"));
if (dialog.exec() == QDialog::Accepted) {
qDebug() << "Click the 'Yes' button.";
}
else {
qDebug() << "Click the 'No' or 'Close' button.";
}
return a.exec();
}
- 头文件
#include <QDialog>
class QLabel;
class QPushButton;
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
/* 设置对话框内容文本 */
void setText(const QString &text);
protected:
/**
* 1.绘图事件
* 2.绘制圆角矩形对话框(背景)
*/
void paintEvent(QPaintEvent *);
/**
* 1.鼠标按下事件
* 2.记录鼠标按下的坐标位置,用于移动窗口
*/
void mousePressEvent(QMouseEvent *event);
/**
* 1.鼠标移动事件
* 2.计算移动窗口
*/
void mouseMoveEvent(QMouseEvent *event);
private:
QLabel *m_contentText;
QPushButton *m_okButton;
QPushButton *m_cancelButton;
QPushButton *m_closeButton;
/* 记录鼠标按下的坐标位置 */
QPoint m_startPoint;
};
- 使用XPM字符图像加载右上角关闭图标。
/**
* 1.XPM字符图像,可用于QPixmap加载为图像。
* 2.关于更多:
* 2.1 Qt君公众号文章:《Qt加载XPM图像》
* 2.2 png转xpm格式工具: https://cn.office-converter.com/PNG-to-XPM
*/
static const char *s_close_xpm[] = {
{"32 32 11 1"},
{". c None"},
{"d c #000000"},
{"b c #000000"},
{"e c #000000"},
{"c c #000000"},
{"f c #000000"},
{"g c #000000"},
{"# c #000000"},
{"h c #000000"},
{"i c #000000"},
{"a c #000000"},
{"................................"},
{"................................"},
{"................................"},
{"................................"},
{"................................"},
{"................................"},
{"................................"},
{".......aa..............aa......."},
{".......aaa............aaa......."},
{"........aaa..........aaa........"},
{".........aaa........aaa........."},
{"..........aaa......aaa.........."},
{"...........aaa....aaa..........."},
{"............aaa..aaa............"},
{".............aaaaaa............."},
{"..............aaaa.............."},
{"..............aaaa.............."},
{".............aaaaaa............."},
{"............aaa..aaa............"},
{"...........aaa....aaa..........."},
{"..........aaa......aaa.........."},
{".........aaa........aaa........."},
{"........aaa..........aaa........"},
{".......aaa............aaa......."},
{".......aa..............aa......."},
{"................................"},
{"................................"},
{"................................"},
{"................................"},
{"................................"},
{"................................"},
{"................................"}
};
- 构造函数初始化按钮,内容文本布局管理。
Dialog::Dialog(QWidget *parent) :
QDialog(parent)
{
/* 设置无标题栏和无边框窗口 */
this->setWindowFlags(windowFlags() | Qt::FramelessWindowHint);
this->setAttribute(Qt::WA_TranslucentBackground);
this->setAutoFillBackground(true);
/* 设置背景颜色 */
QPalette palette = this->palette();
palette.setColor(QPalette::Background, "white");
this->setPalette(palette);
/* 设置对话框样式表 */
this->setStyleSheet(R"(
QDialog {
border-radius: 5px;
border-width: 2px;
}
)");
/* 创建对话框内容文本 */
m_contentText = new QLabel(this);
QFont font = m_contentText->font();
font.setPixelSize(18);
m_contentText->setFont(font);
/* 创建Yes(ok)按钮并通过样式表美化 */
m_okButton = new QPushButton("Yes", this);
m_okButton->setFixedSize(80, 30);
m_okButton->setStyleSheet(QString(R"(
QPushButton {
border-radius: 5px;
border-width: 1px;
border-color: #1ABC9B;
border-style: solid;
margin: 0px;
padding: 0px;
font-size: %1px;
color: black;
background: white;
outline: none;
}
QPushButton:hover {
outline: none;
background: #1ABC9B;
color: white;
text-decoration:underline;
}
)").arg(15));
/* 创建No(cancel)按钮并通过样式表美化 */
m_cancelButton = new QPushButton("No", this);
m_cancelButton->setFixedSize(80, 30);
m_cancelButton->setStyleSheet(QString(R"(
QPushButton {
border-radius: 5px;
border-width: 1px;
border-color: #1ABC9B;
border-style: solid;
margin: 0px;
padding: 0px;
font-size: %1px;
color: black;
background: white;
outline: none;
}
QPushButton:hover{
outline: none;
background: #1ABC9B;
color: white;
text-decoration:underline;
}
)").arg(15));
/* 加载关闭按钮的图标 */
QPixmap closePixmap(s_close_xpm);
QIcon closeIcon(closePixmap);
/* 创建右上角的关闭按钮并通过样式表美化 */
m_closeButton = new QPushButton(closeIcon, "");
m_closeButton->setIconSize(QSize(24, 24));
m_closeButton->setStyleSheet(QString(R"(
QPushButton {
border-radius: 5px;
border-width: 1px;
border-color: #1ABC9B;
border-style: solid;
margin: 0px;
padding: 0px;
font-size: %1px;
color: black;
background: white;
outline: none;
}
QPushButton:hover{
outline: none;
background: #1ABC9B;
color: white;
text-decoration:underline;
}
)").arg(15));
/* 布局管理[start] */
/* 布局关闭按钮与内容栏 */
QVBoxLayout *vLayout = new QVBoxLayout;
vLayout->addWidget(m_closeButton, 0, Qt::AlignRight);
vLayout->addWidget(m_contentText, 0, Qt::AlignHCenter);
/* 布局Yes和No按钮 */
QHBoxLayout *hLayout = new QHBoxLayout;
hLayout->addStretch();
hLayout->addWidget(m_okButton);
hLayout->addWidget(m_cancelButton);
vLayout->addLayout(hLayout);
setLayout(vLayout);
/* 布局管理[end] */
/* 绑定按钮的事件通知 */
/* 注意:accept和close被调用后自动关闭对话框 */
connect(m_okButton, SIGNAL(clicked(bool)), this, SLOT(accept()));
connect(m_cancelButton, SIGNAL(clicked(bool)), this, SLOT(close()));
connect(m_closeButton, SIGNAL(clicked(bool)), this, SLOT(close()));
}
- 设置对话框内容文本。
void Dialog::setText(const QString &text)
{
m_contentText->setText(text);
}
- 绘制圆角矩形对话框(背景)。
void Dialog::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
QPen pen(QColor("black"));
pen.setWidth(1);
painter.setPen(pen);
painter.setBrush(QBrush(QColor("white")));
painter.drawRoundedRect(0, 0, width(), height(), 5, 5);
}
- 鼠标按下事件,记录鼠标按下的坐标位置,用于移动窗口实现。
void Dialog::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
/* 记录鼠标按下的坐标位置,用于移动窗口实现 */
m_startPoint = frameGeometry().topLeft() - event->globalPos();
}
}
- 鼠标移动事件,用于移动对话框窗口。
void Dialog::mouseMoveEvent(QMouseEvent *event)
{
/* 移动窗口 */
this->move(event->globalPos() + m_startPoint);
}
- Mongodb副本集+分片集群环境部署记录
- 线上mongodb 数据库用户到期时间修改的操作记录
- 微信小程序“授权失败”场景的处理
- 动软.net代码生成器 win2008 r2下无法连接oracle,以及vs2008模板丢失的解决
- ASP.NET Web API 支持 CORS
- oracle odp.net 32位/64位版本的问题
- Redis+TwemProxy(nutcracker)集群方案部署记录
- 金融科技新常态,未来开启拼“硬实力”阶段
- Mono 3 的默认Gc是Sgen
- Linux下Redis主从复制以及SSDB主主复制环境部署记录
- 单元测试同时支持 NUnit/MSTest
- log4net快速上手
- MySQL高可用方案-PXC环境部署记录
- Redis主从复制下的工作原理梳理
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- laravel-admin 管理平台获取当前登陆用户信息的例子
- Yii框架Session与Cookie使用方法示例
- laravel 实现登陆后返回登陆前的页面方法
- Laravel 登录后清空COOKIE的操作方法
- 使用laravel和ajax实现整个页面无刷新的操作方法
- Laravel 读取 config 下的数据方法
- PHP实现数组根据某个字段进行水平合并,横向合并案例分析
- laravel框架上传图片实现实时预览功能
- PHP 多进程与信号中断实现多任务常驻内存管理实例方法
- Yii 框架控制器创建使用及控制器响应操作示例
- laravel-admin 实现给grid的列添加行数序号的方法
- Laravel 自动生成验证的实例讲解:login / logout
- 关于Laravel-admin的基础用法总结和自定义model详解
- 解决Laravel5.2 Auth认证退出失效的问题
- php输出文字乱码的解决方法