Qt|QDialog的创建及使用

创建一个新的类继承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();
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奇树谦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值