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