-
- [3.2 自定义对话框及其调用](#3.2 自定义对话框及其调用)
-
- [3.3 Splash与登录窗口](#3.3 Splash与登录窗口)
3.2 自定义对话框及其调用
在一个应用程序设计中,为了实现一些特定的功能,必 须设计自定义对话框。自定义对话框的设计一般从 QDialog继承,并且可以采用UI设计器可视化地设计对 话框。对话框的调用一般包括创建对话框、传递数据给 对话框、显示对话框获取输入、判断对话框单击按钮的 返回类型、获取对话框输入数据等过程。
实例:
cpp
#ifndef MODIFYDIALOG_H
#define MODIFYDIALOG_H
#include <QDialog>
namespace Ui {
class ModifyDialog;
}
class ModifyDialog : public QDialog
{
Q_OBJECT
public:
// 构造函数,参数为父窗口指针,默认为空指针
explicit ModifyDialog(QWidget *parent = nullptr);
// 析构函数
~ModifyDialog();
// 设置姓名和年龄的函数,接受姓名和年龄作为参数
void set_name_age(const QString& name, int age);
// 获取姓名的函数,返回姓名字符串
QString get_name();
// 获取年龄的函数,返回整数年龄
int get_age();
private:
Ui::ModifyDialog *ui; // UI 指针
};
#endif // MODIFYDIALOG_H
cpp
#include "modifydialog.h"
#include "ui_modifydialog.h"
// 构造函数实现,接受父窗口指针,默认为空指针
ModifyDialog::ModifyDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::ModifyDialog)
{
ui->setupUi(this); // 初始化 UI
}
// 析构函数实现
ModifyDialog::~ModifyDialog()
{
delete ui; // 释放 UI 指针的内存
}
// 设置姓名和年龄的函数实现,接受姓名和年龄作为参数
void ModifyDialog::set_name_age(const QString &name, int age)
{
ui->sb_age->setValue(age); // 设置年龄的SpinBox的值
ui->le_name->setText(name); // 设置姓名的LineEdit的文本
}
// 获取姓名的函数实现,返回姓名字符串
QString ModifyDialog::get_name()
{
return ui->le_name->text(); // 获取姓名的LineEdit的文本
}
// 获取年龄的函数实现,返回整数年龄
int ModifyDialog::get_age()
{
return ui->sb_age->value(); // 获取年龄的SpinBox的值
}
cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "modifydialog.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
// 创建 ModifyDialog 对象,传入父窗口指针
ModifyDialog *md = new ModifyDialog(this);
// 对话框关闭时自动删除对话框对象,用于不需要读取返回值的对话框
// 如果需要获取对话框的返回值,不能设置该属性,可以在调用完对话框后手动删除对话框
// md->setAttribute(Qt::WA_DeleteOnClose);
// 获取对话框的窗口标志
Qt::WindowFlags flags = md->windowFlags();
// 设置对话框固定大小
md->setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint);
// 将主对话框中的信息传入到自定义对话框中
md->set_name_age(ui->le_name->text(), ui->le_age->text().toInt());
// 执行对话框,获取返回值
int ret = md->exec();
// 如果对话框被接受(OK按钮被点击)
if (ret == QDialog::Accepted) {
// 将对话框中获取的值更新到主窗口的LineEdit中
ui->le_age->setText(QString::asprintf("%d", md->get_age()));
ui->le_name->setText(md->get_name());
}
// 手动删除对话框
delete md;
}
小结:
如果主程序中需要自定义窗口的信息,那就不要调用 setAttribute(Qt::WA_DeleteOnClose)设定自定义窗口 结束后自动销毁。当使用完毕后可以通过delete的方式 自定义窗口在运行期间想获取更多主窗口中的信息,可 以通过parentWidget()函数获取到主窗口句柄。
3.3 Splash与登录窗口
常用的窗体基类是QWidget、 QDialog和QMainWindow,在创建GUI应用程序时选择 窗体基类就从这3个类中选择。
一般大型应用程序在启动时会显示一个启动画面,即 Splash窗口。Splash窗口是一个无边框的对话框,一般 显示一个图片,展示软件的信息。Splash窗口显示时, 程序在后台做一些比较耗时的启动准备工作,Splash窗 口显示一段时间后自动关闭,软后软件的主窗口显示出 来。Qt有一个QSplashScreen类可以实现Splash窗口的 工作,它提供而来载入图片,自动设置窗口无边框效果 等功能。有的应用程序还有软件登录界面,要求用户输 入用户名和密码才可以进入软件。
cpp
#include "logindialog.h"
#include "ui_logindialog.h"
LoginDialog::LoginDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::LoginDialog)
{
ui->setupUi(this);
// 设置对话框关闭时自动删除对象
setAttribute(Qt::WA_DeleteOnClose);
// 设置对话框的窗口标志为 SplashScreen 实现无边框效果
setWindowFlags(Qt::SplashScreen);
}
LoginDialog::~LoginDialog()
{
delete ui;
}
void LoginDialog::on_buttonBox_accepted()
{
// 检查用户名和密码是否符合预期
if (ui->le_name->text().trimmed() == "李钢蛋儿" &&
ui->le_passwd->text().trimmed() == "123456") {
// 符合预期则接受对话框
return accept();
} else {
// 不符合预期则拒绝对话框
return reject();
}
}
cpp
#include "mainwindow.h" // 包含头文件mainwindow.h
#include <QApplication> // 包含头文件QApplication
#include "logindialog.h" // 包含头文件logindialog.h
int main(int argc, char *argv[]) // 定义main函数
{
QApplication a(argc, argv); // 创建一个QApplication对象a
LoginDialog *dlgLogin = new LoginDialog; // 创建一个LoginDialog对象dlgLogin
if(dlgLogin->exec() == QDialog::Accepted) // 如果用户单击了"确定"按钮
{
MainWindow w; // 创建一个MainWindow对象w
w.show(); // 显示MainWindow对象
return a.exec(); // 进入主事件循环,等待应用程序退出
}
else // 如果用户单击了"取消"按钮或关闭了登录对话框
{
return 0; // 返回0,退出应用程序
}
}