对话框与多窗体设计 —— 自定义对话框及其调用

    • [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,退出应用程序
    }
}
相关推荐
用户805533698033 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner3 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz8 天前
QML Hello World 入门示例
qt
xcyxiner11 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner12 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner12 天前
DicomViewer (添加模型类)3
qt
xcyxiner13 天前
DicomViewer (目录调整) 2
qt
xcyxiner13 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
桥田智能15 天前
桥田智能 QT-650S:面向白车身焊装的 800kg 重载快换解决方案
开发语言·qt·系统架构
森G15 天前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt