文章目录
- 创建一个新的类继承QDialog
 - 设置标题
 - 去掉问号,只保留关闭
 - 使窗口在屏幕中心显示
 - 设置窗口大小
 - QDialog没有任务栏窗口图标问题
 - 将窗口永远置于上层可见 不会被遮盖
 - 阻塞除当前窗口之外的所有窗口
 - 添加closeEvent hideEvent同理
 - 调用dialog类接收dialog返回状态(确认或者取消)
 - 解决中文乱码问题
 - dialog整体代码
 
创建一个新的类继承QDialog

 

设置标题
setWindowTitle("dialog练习");
 
去掉问号,只保留关闭
// 去掉问号,只保留关闭
setWindowFlags(windowFlags()&~Qt::WindowContextHelpButtonHint);
 
使窗口在屏幕中心显示
// 添加头文件
#include <QGuiApplication>
#include <QScreen>
QScreen *mScreen = QGuiApplication::screens().first();
this->move((mScreen->geometry().width() - this->width()) / 2, (mScreen->geometry().height() - this->height()) / 2);
 
设置窗口大小
// 设置窗口大小
resize(300,300);
 
QDialog没有任务栏窗口图标问题
// 需要在头文件将构造函数的父类设置为nullptr 
MyQDialog(QWidget *parent = nullptr);
~MyQDialog();
 
将窗口永远置于上层可见 不会被遮盖
setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);
 
阻塞除当前窗口之外的所有窗口
setWindowModality(Qt::ApplicationModal);
 
添加closeEvent hideEvent同理
右键类名,如下图选择。
 
 勾选closeEvent 点击确认即可。
 
 也可自己手动添加代码如下:
// 头文件添加
protected:
	virtual void closeEvent(QCloseEvent *event) override;
// cpp添加
void MyQDialog::closeEvent(QCloseEvent *event)
{
	throw std::logic_error("The method or operation is not implemented.");
}
 
调用dialog类接收dialog返回状态(确认或者取消)
首先创建确认和取消按钮,也可不添加取消按钮关闭窗口默认为取消,创建一个类内全局变量用于记录状态,在按钮的槽函数里改变变量状态。
 dialog类内添加代码示例如下:
// dialog头文件添加
void SlotCancelClicked();		// 取消按钮槽函数
void SlotDefineBtnClicked();	// 确定按钮槽函数
QPushButton* define_pushbutton_;		// 确定
QPushButton* cancel_pushbutton_;		// 取消
bool is_accept;
// cpp添加
// 初始化函数里添加
is_accept = false;
QHBoxLayout* button_group_layout = new QHBoxLayout(this);
button_group_layout->addSpacerItem(new QSpacerItem(0, 25, QSizePolicy::Expanding, QSizePolicy::Fixed));
define_pushbutton_ = new QPushButton("确定");
button_group_layout->addWidget(define_pushbutton_);
cancel_pushbutton_ = new QPushButton("取消");
button_group_layout->addWidget(cancel_pushbutton_);
void MyQDialog::InitConnect()
{
	connect(cancel_pushbutton_, &QPushButton::clicked, this, &MyQDialog::SlotCancelClicked);
	connect(define_pushbutton_, &QPushButton::clicked, this, &MyQDialog::SlotDefineBtnClicked);
}
void MyQDialog::SlotCancelClicked()
{
	// dosomething
	close();
}
void MyQDialog::SlotDefineBtnClicked()
{
	is_accept = true;
	// dosomething
	close();
}
void MyQDialog::closeEvent(QCloseEvent *event)
{
	if (is_accept)
		QDialog::accept();
	else
		QDialog::reject();
}
 
调用类添加代码如下:
// 头文件
std::shared_ptr<MyQDialog> my_dialog_;
// cpp
my_dialog_ = std::make_shared<MyQDialog>(); 
if (my_dialog_->exec() == QDialog::Rejected)
	exit(0);
else
	QMessageBox::information(this, "提示", "即将进入主界面。");
 
解决中文乱码问题
Qt解决中文乱码几种方法
dialog整体代码
.h
#pragma once
#include <QDialog>
class MyQDialog : public QDialog
{
	Q_OBJECT
public:
	MyQDialog(QWidget *parent = nullptr);
	~MyQDialog();
private:
	void Init();			// 初始化函数
	void InitConnect();		// 连接槽函数
	void SlotCancelClicked();		// 取消按钮槽函数
	void SlotDefineBtnClicked();	// 确定按钮槽函数
	QPushButton* define_pushbutton_;		// 确定
	QPushButton* cancel_pushbutton_;		// 取消
	bool is_accept;
protected:
	virtual void closeEvent(QCloseEvent *event) override;
};
 
.cpp
#pragma execution_character_set("utf-8")
#include "MyQDialog.h"
#include <QGuiApplication>
#include <QScreen>
#include <QHBoxLayout>
#include <QPushButton>
MyQDialog::MyQDialog(QWidget *parent)
	: QDialog(parent)
{
	Init();
	InitConnect();
}
MyQDialog::~MyQDialog()
{
}
void MyQDialog::Init()
{
	// 将窗口永远置于上层可见 不会被遮盖
	//setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);
	// 阻塞除当前窗口之外的所有窗口
	//setWindowModality(Qt::ApplicationModal);
	// 去掉问号,只保留关闭
	setWindowFlags(windowFlags()&~Qt::WindowContextHelpButtonHint);
	// 设置窗口标题
	setWindowTitle("dialog练习");
	// 设置窗口大小
	resize(250,70);
	// 使窗口在屏幕中心显示
	QScreen *mScreen = QGuiApplication::screens().first();
	this->move((mScreen->geometry().width() - this->width()) / 2, (mScreen->geometry().height() - this->height()) / 2);
	is_accept = false;
	QHBoxLayout* button_group_layout = new QHBoxLayout(this);
	button_group_layout->addSpacerItem(new QSpacerItem(0, 25, QSizePolicy::Expanding, QSizePolicy::Fixed));
	define_pushbutton_ = new QPushButton("确定");
	button_group_layout->addWidget(define_pushbutton_);
	cancel_pushbutton_ = new QPushButton("取消");
	button_group_layout->addWidget(cancel_pushbutton_);
}
void MyQDialog::InitConnect()
{
	connect(cancel_pushbutton_, &QPushButton::clicked, this, &MyQDialog::SlotCancelClicked);
	connect(define_pushbutton_, &QPushButton::clicked, this, &MyQDialog::SlotDefineBtnClicked);
}
void MyQDialog::SlotCancelClicked()
{
	// dosomething
	close();
}
void MyQDialog::SlotDefineBtnClicked()
{
	is_accept = true;
	// dosomething
	close();
}
void MyQDialog::closeEvent(QCloseEvent *event)
{
	if (is_accept)
		QDialog::accept();
	else
		QDialog::reject();
}










