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

    • [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,退出应用程序
    }
}
相关推荐
很楠不爱1 小时前
Qt——窗口
开发语言·qt
Mr.Q10 小时前
Qt多边形填充/不填充绘制
qt
可峰科技11 小时前
斗破QT编程入门系列之二:认识Qt:编写一个HelloWorld程序(四星斗师)
开发语言·qt
7年老菜鸡12 小时前
策略模式(C++)三分钟读懂
c++·qt·策略模式
huanggang98216 小时前
在Ubuntu22.04上使用Qt Creator开发ROS2项目
qt·ros2
老秦包你会17 小时前
Qt第三课 ----------容器类控件
开发语言·qt
spygg18 小时前
Qt低版本多网卡组播bug
qt·组播·多网卡组播·qt5.7.0
码农客栈18 小时前
qt QWebSocketServer详解
qt
plmm烟酒僧20 小时前
Windows下QT调用MinGW编译的OpenCV
开发语言·windows·qt·opencv
Black_Friend20 小时前
关于在VS中使用Qt不同版本报错的问题
开发语言·qt