- 3.2 自定义对话框及其调用
- 3.3 Splash与登录窗口
3.2 自定义对话框及其调用
在一个应用程序设计中,为了实现一些特定的功能,必 须设计自定义对话框。自定义对话框的设计一般从 QDialog继承,并且可以采用UI设计器可视化地设计对 话框。对话框的调用一般包括创建对话框、传递数据给 对话框、显示对话框获取输入、判断对话框单击按钮的 返回类型、获取对话框输入数据等过程。
实例:
#ifndef MODIFYDIALOG_H
#define MODIFYDIALOG_H#include <QDialog>namespace Ui {
class ModifyDialog;
}class ModifyDialog : public QDialog
{Q_OBJECTpublic:// 构造函数,参数为父窗口指针,默认为空指针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
#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的值
}
#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窗口的 工作,它提供而来载入图片,自动设置窗口无边框效果 等功能。有的应用程序还有软件登录界面,要求用户输 入用户名和密码才可以进入软件。
#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();}
}
#include "mainwindow.h" // 包含头文件mainwindow.h
#include <QApplication> // 包含头文件QApplication
#include "logindialog.h" // 包含头文件logindialog.hint main(int argc, char *argv[]) // 定义main函数
{QApplication a(argc, argv); // 创建一个QApplication对象aLoginDialog *dlgLogin = new LoginDialog; // 创建一个LoginDialog对象dlgLoginif(dlgLogin->exec() == QDialog::Accepted) // 如果用户单击了“确定”按钮{MainWindow w; // 创建一个MainWindow对象ww.show(); // 显示MainWindow对象return a.exec(); // 进入主事件循环,等待应用程序退出}else // 如果用户单击了“取消”按钮或关闭了登录对话框{return 0; // 返回0,退出应用程序}
}