Qt|QDialog的创建及使用

文章目录

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

创建一个新的类继承QDialog

Qt|QDialog的创建及使用_第1张图片
Qt|QDialog的创建及使用_第2张图片

Qt|QDialog的创建及使用_第3张图片

设置标题

setWindowTitle("dialog练习");

去掉问号,只保留关闭

// 去掉问号,只保留关闭
setWindowFlags(windowFlags()&~Qt::WindowContextHelpButtonHint);

使窗口在屏幕中心显示

// 添加头文件
#include 
#include 

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同理

右键类名,如下图选择。
Qt|QDialog的创建及使用_第4张图片
勾选closeEvent 点击确认即可。
Qt|QDialog的创建及使用_第5张图片
也可自己手动添加代码如下:

// 头文件添加
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 

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 
#include 
#include 
#include 

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();
}

你可能感兴趣的:(C/C++/qt,qt,开发语言,c++)