几种标准对话框

几种标准对话框

1、颜色对话框

用途:颜色对话框用来选择颜色,创建后会显示各种颜色和透明度信息

void MainWindow::on_pushButton_clicked()
{
    // 创建一个颜色选择对话框,初始颜色设置为蓝色 (Qt::blue)
    // 'this' 表示该对话框的父对象是 MainWindow
    QColorDialog colorDlg(Qt::blue, this);

    // 启用“透明度通道”选项,让用户可以选择颜色的透明度(Alpha 值)
    colorDlg.setOption(QColorDialog::ShowAlphaChannel);

    // 以模态方式运行颜色对话框,阻塞当前函数直到用户关闭对话框
    colorDlg.exec();

    // 获取用户在颜色对话框中选择的颜色
    QColor color = colorDlg.currentColor();

    // 在调试输出中打印颜色值(包括 RGB 和 Alpha)
    qDebug() << "color is " << color;
}

2、文本对话框

用途:创建一个选择文件的对话框,选择后,可以根据返回值打印选择的文件的路径信息

void MainWindow::on_pushButton_2_clicked()
{
    // 获取当前程序的工作目录路径
    QString path = QDir::currentPath();

    // 设置文件对话框的标题
    QString title = tr("文件对话框");

    // 设置文件过滤器(可选择显示的文件类型)
    // 1. 文本文件 (*.txt)
    // 2. 图片文件 (*.jpg, *.gif, *.png)
    // 3. 所有文件 (*.*)
    QString filter = tr("文本文件(*.txt);;图片文件(*.jpg *.gif *.png);;所有文件(*.*)");

    // 打开“打开文件”对话框
    // 参数依次是:父窗口、对话框标题、初始路径、过滤器
    // 返回用户选择的文件路径,如果取消则返回空字符串
    QString aFileName = QFileDialog::getOpenFileName(this, title, path, filter);

    // 调试输出所选择的文件路径,并换行
    qDebug() << aFileName << Qt::endl;
}

3、输入对话框

1、文本输入对话框

void MainWindow::on_pushButton_3_clicked()
{
    // 用于接收用户是否点击了“确定”按钮的状态
    bool ok = false;

    // 弹出一个文本输入对话框
    // 参数依次是:
    // 1. this               —— 父窗口
    // 2. tr("文字输入对话框") —— 对话框标题
    // 3. tr("请输入用户的姓名") —— 提示标签文本
    // 4. QLineEdit::Normal  —— 文本输入模式(Normal 表示正常可见的文本)
    // 5. tr("admin")        —— 输入框的默认值
    // 6. &ok                —— 返回值参数,true 表示点击了“确定”,false 表示点击了“取消”
    auto text = QInputDialog::getText(
        this,
        tr("文字输入对话框"),
        tr("请输入用户的姓名"),
        QLineEdit::Normal,
        tr("admin"),
        &ok
    );

    // 如果用户点击了“确定”按钮
    if (ok) {
        // 在调试输出中打印输入的文本
        qDebug() << text << endl;
    }
}

2、整数输入对话框

void MainWindow::on_pushButton_4_clicked()
{
    // 用于接收用户是否点击了“确定”按钮
    bool ok = false;

    // 弹出一个整数输入对话框
    // 参数依次是:
    // 1. this                    —— 父窗口
    // 2. tr("数字输入对话框")       —— 对话框标题
    // 3. tr("请输入数字")           —— 提示标签文本
    // 4. 200                      —— 输入框的默认值
    // 5. -200                     —— 可输入的最小值
    // 6. 400                      —— 可输入的最大值
    // 7. 10                       —— 步长(按上下箭头时加减的数值)
    // 8. &ok                      —— 返回值参数,true 表示点击了“确定”,false 表示点击了“取消”
    auto intdata = QInputDialog::getInt(
        this,
        tr("数字输入对话框"),
        tr("请输入数字"),
        200,
        -200,
        400,
        10,
        &ok
    );

    // 如果用户点击了“确定”按钮
    if (ok) {
        // 在调试输出中打印输入的整数值
        qDebug() << intdata << endl;
    }
}

3、浮点输入对话框

void MainWindow::on_pushButton_5_clicked()
{
    // 用于接收用户是否点击了“确定”按钮
    bool ok = false;

    // 弹出一个浮点数输入对话框
    // 参数依次是:
    // 1. this                       —— 父窗口
    // 2. tr("浮点数输入对话框")        —— 对话框标题
    // 3. tr("输入浮点数")              —— 提示标签文本
    // 4. 0.1                         —— 输入框的默认值
    // 5. -1                          —— 可输入的最小值
    // 6. 1                           —— 可输入的最大值
    // 7. 2                           —— 小数精度(保留的小数位数)
    // 8. &ok                         —— 返回值参数,true 表示点击了“确定”,false 表示点击了“取消”
    auto floatdata = QInputDialog::getDouble(
        this,
        tr("浮点数输入对话框"),
        tr("输入浮点数"),
        0.1,
        -1,
        1,
        2,
        &ok
    );

    // 如果用户点击了“确定”按钮
    if (ok) {
        // 在调试输出中打印输入的浮点数
        qDebug() << floatdata << endl;
    }
}

4、条目输入对话框

void MainWindow::on_pushButton_6_clicked()
{
    // 创建一个字符串列表,作为可选择的条目
    QStringList items;
    items << tr("条目1") << tr("条目2");

    // 用于接收用户是否点击了“确定”按钮
    bool ok = false;

    // 弹出一个条目选择输入对话框
    // 参数依次是:
    // 1. this                       —— 父窗口
    // 2. tr("条目输入对话框")          —— 对话框标题
    // 3. tr("输入或选择条目")           —— 提示标签文本
    // 4. items                       —— 条目列表
    // 5. 0                           —— 默认选中的索引(0 表示第一项)
    // 6. true                        —— 是否允许用户手动输入新的条目(true 表示可以输入)
    // 7. &ok                         —— 返回值参数,true 表示点击了“确定”,false 表示点击了“取消”
    auto itemData = QInputDialog::getItem(
        this,
        tr("条目输入对话框"),
        tr("输入或选择条目"),
        items,
        0,
        true,
        &ok
    );

    // 如果用户点击了“确定”按钮
    if (ok) {
        // 在调试输出中打印选择或输入的条目内容
        qDebug() << "item is " << itemData << endl;
    }
}

4、提示对话框

void MainWindow::on_pushButton_7_clicked()
{
    // 1️⃣ 询问对话框(question)
    // 参数依次是:
    // 1. this                   —— 父窗口
    // 2. tr("提示对话框")         —— 对话框标题
    // 3. tr("你是abc吗?")         —— 提示文本
    // 4. QMessageBox::Yes       —— 第一个按钮
    // 5. QMessageBox::No        —— 第二个按钮
    auto ret = QMessageBox::question(
        this,
        tr("提示对话框"),
        tr("你是abc吗?"),
        QMessageBox::Yes,
        QMessageBox::No
    );

    if (ret == QMessageBox::Yes) {
        qDebug() << "ret is " << ret << "你好abc" << Qt::endl;
    } else {
        return; // 如果选择 "No",直接结束函数
    }

    // 2️⃣ 信息通知对话框(information)
    auto ret2 = QMessageBox::information(
        this,
        tr("通知对话框"),
        tr("你好abc"),
        QMessageBox::Yes
    );

    if (ret2 == QMessageBox::Yes) {
        qDebug() << "ret2 is " << ret2;
    } else {
        return; // 如果不是 "Yes",结束函数
    }

    // 3️⃣ 警告对话框(warning)
    auto rets = QMessageBox::warning(
        this,
        tr("警告对话框"),
        tr("警告"),
        QMessageBox::Yes
    );

    if (rets == QMessageBox::Yes) {
        qDebug() << "rets is " << rets;
    } else {
        return;
    }

    // 4️⃣ 严重错误/关键提示对话框(critical)
    auto ret4 = QMessageBox::critical(
        this,
        tr("关键提示对话框"),
        tr("关键提示"),
        QMessageBox::Ok
    );

    if (ret4 == QMessageBox::Ok) {
        qDebug() << "ret4 is " << ret4 << Qt::endl;
    }
}

5、进度对话框

// ****************************** 进度对话框 **************************************

void MainWindow::on_pushButton_8_clicked()
{
    // 创建进度对话框
    // 参数依次是:
    // 1. tr("正在复制")   —— 对话框内容文本(进度提示)
    // 2. tr("取消复制")   —— 取消按钮文字
    // 3. 0               —— 进度条最小值
    // 4. 5000            —— 进度条最大值
    // 5. this            —— 父窗口
    _progressDialog = new QProgressDialog(tr("正在复制"), tr("取消复制"), 0, 5000, this);

    // 设置对话框标题
    _progressDialog->setWindowTitle(tr("文件复制进度对话框"));

    // 设置为应用程序级模态对话框(阻止操作其他窗口)
    _progressDialog->setWindowModality(Qt::ApplicationModal);

    // 创建定时器,用于定时更新进度
    _timer = new QTimer(this);

    // 每次定时器超时,调用 on_updateProgressDialog 更新进度
    connect(_timer, &QTimer::timeout, this, &MainWindow::on_updateProgressDialog);

    // 当用户点击“取消”按钮,调用 on_cancelProgressDialog
    connect(_progressDialog, &QProgressDialog::canceled, this, &MainWindow::on_cancelProgressDialog);

    // 启动定时器,每 2 毫秒触发一次 timeout 信号
    _timer->start(2);
}

// 当用户取消进度对话框时执行
void MainWindow::on_cancelProgressDialog(){
    // 停止并删除定时器
    _timer->stop();
    delete _timer;
    _timer = nullptr;

    // 删除进度对话框对象
    delete _progressDialog;
    _progressDialog = nullptr;

    // 重置计数器
    _counter = 0;
    return;
}

// 更新进度条的槽函数
void MainWindow::on_updateProgressDialog(){
    _counter++; // 每次调用进度加 1

    // 如果进度超出最大值(5000),停止进度
    if (_counter > 5000) {
        _timer->stop();
        delete _timer;
        _timer = nullptr;

        // 删除进度对话框
        delete _progressDialog;

        // 重置计数器
        _counter = 0;
        return;
    }

    // 更新进度对话框的当前值
    _progressDialog->setValue(_counter);
}

// ****************************** 进度对话框 **************************************

6、向导对话框

// ****************************** 向导对话框 **************************************

void MainWindow::on_pushButton_8_clicked()
{
    // 创建向导对话框(QWizard),父对象为 MainWindow
    QWizard wizard(this);
    wizard.setWindowTitle(tr("美味水果")); // 设置窗口标题

    // ------------------ 第 1 页:介绍页 ------------------
    auto page1 = new QWizardPage(); // 向导页面对象
    page1->setTitle(tr("美味水果引导程序")); // 页面标题

    auto label1 = new QLabel(); // 标签
    label1->setText(tr("该程序帮你找到美味水果")); // 设置介绍文字

    auto layout = new QVBoxLayout(); // 垂直布局
    layout->addWidget(label1); // 把标签加到布局中
    page1->setLayout(layout); // 设置页面布局

    wizard.addPage(page1); // 添加到向导对话框

    // ------------------ 第 2 页:选择水果 ------------------
    QWizardPage * page2 = new QWizardPage();
    page2->setTitle("选择心动水果");

    auto group = new QButtonGroup(page2); // 按钮组,用于管理单选按钮

    // 创建 5 个单选按钮
    auto btn1 = new QRadioButton();
    btn1->setText("荔枝");
    group->addButton(btn1);

    auto btn2 = new QRadioButton();
    btn2->setText("苹果");
    group->addButton(btn2);

    auto btn3 = new QRadioButton();
    btn3->setText("香蕉");
    group->addButton(btn3);

    auto btn4 = new QRadioButton();
    btn4->setText("西瓜");
    group->addButton(btn4);

    auto btn5 = new QRadioButton();
    btn5->setText("葡萄");
    group->addButton(btn5);

    // 布局添加所有单选按钮
    auto layout2 = new QVBoxLayout();
    for (int i = 0; i < group->buttons().size(); ++i) {
        layout2->addWidget(group->buttons()[i]);
    }
    page2->setLayout(layout2);

    wizard.addPage(page2); // 添加到向导对话框

    // ------------------ 第 3 页:结束页 ------------------
    QWizardPage * page3 = new QWizardPage();
    page3->setTitle(tr("你的水果即将到来"));

    auto label3 = new QLabel();
    label3->setText(tr("感谢您的参与,祝你吃到美味的水果"));

    QVBoxLayout * layout3 = new QVBoxLayout();
    layout3->addWidget(label3);
    page3->setLayout(layout3);

    wizard.addPage(page3);

    // ------------------ 显示向导 ------------------
    wizard.show(); // 先显示(非必须)
    wizard.exec(); // 模态方式运行向导
}

// ****************************** 向导对话框 **************************************
posted @ 2025-08-14 23:46  xiaoluosibky  阅读(13)  评论(0)    收藏  举报