Loading

9_对话框.md

对话框

分类

​ Qt 中使用 QDialog 类实现对话框。就像主窗口一样,我们通常会设计一个类继承 QDialog。

​ QDialog(及其子类,以及所有 Qt::Dialog 类型的类)的对于其 parent 指针都有额外的解释:如果 parent 为 NULL,则该对话框会作为一个顶层窗口,否则则作为其父组件的子对话框(此时,其默认出现的位置是 parent 的中心)。顶层窗口在任务栏会有自己的位置,而非顶层窗口则会共享其父组件的位置。

  • 模态对话框 : qt有两种-> 应用级(默认)和窗口级
  • 非模态对话框

模态对话框:

#include "mainwindow.h"

#include <QMenuBar>
#include <QToolBar>
#include <QDialog>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    setWindowTitle(tr("Main Window"));

    openAction = new QAction(QIcon(":/images/doc-open"), tr("&Open..."), this);
    openAction->setShortcut(QKeySequence::Open);
    openAction->setStatusTip(tr("Open an existing file"));
    connect(openAction, &QAction::triggered, this, &MainWindow::open);

    QMenu *file = this->menuBar() -> addMenu(tr("&File"));
    file->addAction(openAction);

    QToolBar *toolBar = addToolBar(tr("&File"));
    toolBar->addAction(openAction);

}

MainWindow::~MainWindow()
{
}

void MainWindow::open() {
    QDialog dialog(this);
    dialog.setWindowTitle(tr("Hello, dialog!"));
    dialog.exec();
}

模态:dialog.show()

void MainWindow::open()
{
 QDialog *dialog = new QDialog;
 dialog->setAttribute(Qt::WA_DeleteOnClose);
 dialog->setWindowTitle(tr("Hello, dialog!"));
 dialog->show();
}

​ setAttribute()函数设置对话框关闭时,自动销毁对话框。另外,QObject 还有一个deleteLater()函数,该函数会在当前事件循环结束时销毁该对话框

对话框数据传递

模态对话框

​ 模态对话框使用了 exec()函数将其显示出来。exec()函数的真正含义是开启一个新的事件循环。事件循环,可以理解成一个无限循环。Qt 在开启了事件循环之后,系统发出的各种事件才能够被程序监听到。这个事件循环相当于一种轮询的作用。

​ 对于使用了 exec()显示的模态对话框,我们可以在 exec()函数之后直接从对话框的对象获取到数据值。

void MainWindow::open()
{
 QDialog dialog(this);
 dialog.setWindowTitle(tr("Hello, dialog!"));
 dialog.exec();
 qDebug() << dialog.result();
}

​ 如果我们设置 dialog 的属性为 WA_DeleteOnClose,那么当对话框
关闭时,对象被销毁,我们就不能使用这种办法获取数据了。在这种情况下,我们可以考虑使用 parent 指针的方式构建对话框,避免设置 WA_DeleteOnClose 属性;或者是利用另外的方式。

非模态对话框

​ QDialog::show()函数会立即返回,如果我们也这么写,就不可能取得用户输入的数据。使用信号槽机制获取信息。

​ 非模态对话框在关闭时可以调用 QDialog::accept()或者 QDialog::reject()或者更通用的 QDialog::done()函数,所以我们可以在这里发出信号。如果找不到合适的信号发出点,我们可以重写 QDialog::closeEvent()函数,在这里发出信号。

标准对话框 QMessageBox

Qt内置的对话框:

  • QColorDialog:选择颜色;

    image-20210204214131261

  • QFileDialog: 选择文件或者目录;

  • QFontDialog: 选择字体;

  • QInputDialog: 允许用户输入一个值,并将其值返回;

  • QMessageBox: 模态对话框,用于显示信息、询问问题等;

  • QPageSetupDialog: 为打印机提供纸张相关的选项;

  • QPrintDialog: 打印机配置;

  • QPrintPreviewDialog: 打印预览

  • QProgressDialog: 显示操作过程

QMessageBox

  • void about(QWidget * parent, const QString & title, const QString & text): 显示关于对话框。这是一个最简单的对话框,其标题是 title,内容是 text,父窗口是 parent。对话框只有一个 OK 按钮。

    image-20210204213419894

  • void aboutQt(QWidget * parent, const QString & title = QString()): 显示关于 Qt 对话框。该对话框用于显示有关 Qt 的信息。

    image-20210204213400754

  • StandardButton critical(QWidget * parent, const QString & title, const QString& text, StandardButtons buttons = Ok, StandardButton defaultButton =NoButton): 显示严重错误对话框。这个对话框将显示一个红色的错误符号。我们可以通过 buttons 参数指明其显示的按钮。默认情况下只有一个 Ok 按钮,我们可以使用 StandardButtons 类型指定多种按钮。

    image-20210204213435846

  • StandardButton information(QWidget * parent, const QString & title, constQString & text, StandardButtons buttons = Ok, StandardButton defaultButton =NoButton):QMessageBox::information()函数与 QMessageBox::critical()类似,不同之处在于这个对话框提供一个普通信息图标。

    image-20210204213453720

  • StandardButton question(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = StandardButtons( Yes | No ), StandardButton defaultButton = NoButton):QMessageBox::question()函数与QMessageBox::critical()类似,不同之处在于这个对话框提供一个问号图标,并且其显示的按钮是“是”和“否”两个。

    image-20210204213509624

  • StandardButton warning(QWidget * parent, const QString & title, const QString & text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton):QMessageBox::warning()函数与 QMessageBox::critical()类似,不同之处在于这个对话框提供一个黄色叹号图标。

    image-20210204213522539

void MainWindow::about() {
    QMessageBox::aboutQt(this);
    QMessageBox::about(this, tr("About"), tr("<h1>Hello About This</h1>"));
    QMessageBox::critical(this, tr("Critical"), tr("<h2>error</h2>"));
    QMessageBox::information(this, "Information", "?????");
    QMessageBox::question(this, "Question", "question");
    QMessageBox::warning(this, "Warning", "warning");

    if (QMessageBox::Yes == QMessageBox::question(this, "question", "Are you OK?", QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes)) {
        QMessageBox::information(this, "infor", "你一定是雷军的粉丝了");
    } else {
        QMessageBox::information(this, "information", "Are you OK? Thank you very much.");
    }
}
posted @ 2022-05-27 14:11  nsfoxer  阅读(23)  评论(0编辑  收藏  举报