#《Qt学习之路》学习之路(4)#对话框->标准消息对话框(QMessageBox)

2018.5.29

每周接近997的工作强度实在是压力太大,静下心来整理整理东西。暑假打算挖出曾经做的一些东西来发些文章,希望老板能够同意。


网上大概翻了一些教程,对比一下发现Qt学习之路2的学习推进方式更适合我一些,为了防止自己遗忘,在这里分享一些学习的要点,我记的知识要点可能偏个人一些,大概率思维会比较跳跃,建议参考博主原文和查看官方API理解。


对话框(QDialog):

Qt 中使用QDialog类实现对话框。如果 parent 为 NULL,则该对话框会作为一个顶层窗口,在任务栏会有自己的位置;否则则作为其父组件的子对话框(此时,其默认出现的位置是 parent 的中心),共享其父组件的位置。

通过QDialog dialog;可以使对话框出现在任意位置

通过QDialog dialog(this);可以使对话框出现在窗口正中

通过QDialog *dialog = new QDialog;建在堆上,不会因为show()一闪而过

使用QDialog::open()/exec()实现窗口级别的模态对话框(阻塞其他窗口输入),使用QDialog::show()实现非模态对话框。

扫描二维码关注公众号,回复: 2467146 查看本文章
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QApplication>
#include <QAction>
#include <QMenuBar>
#include <QMessageBox>
#include <QStatusBar>
#include <QToolBar>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    setWindowTitle(tr("Main Window"));

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

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

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

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::open(){
    //出现在任意位置
    //QDialog dialog;
    //出现在窗口正中
    QDialog dialog(this);
    //建在堆上,不会因为show()一闪而过,下方.改为->
    //若用show()一闪而过原因:show()函数不会阻塞当前线程,对话框会显示出来,然后函数立即返回,代码继续执行。
    //dialog 是建立在栈上的,show()函数返回,MainWindow::open()函数结束,dialog 超出作用域被析构,因此对话框消失了。
    //QDialog *dialog = new QDialog;
    //dialog->setAttribute(Qt::WA_DeleteOnClose);

    dialog.setWindowTitle(tr("Hello,dialog!"));
    //使用QDialog::open()/exec()实现窗口级别的模态对话框(阻塞其他窗口输入),使用QDialog::show()实现非模态对话框。
    dialog.exec();
    //dialog.show();

    //qDebug()类似于std::cout或者 Java 的System.out.println();语句,将后面的信息输出到标准输出,一般就是控制台输出。
    //由于exec()函数没有返回,因此下面的result()函数也就不会被执行。直到对话框关闭,exec()函数返回,此时,我们就可以取得对话框的数据。
    qDebug() << dialog.result();
    /*
    判断用户点了确定或者取消
    QDialog dialog(this);
    if (dialog.exec() == QDialog::Accepted) {
    // do something
    } else {
    // do something else
    }
    */
}

运行效果:


由于是模态对话框,在不关闭对话框之前主界面无法移动和操作。

exec()函数的真正含义是开启一个新的事件循环。Qt 在开启了事件循环之后,系统发出的各种事件才能够被程序监听到。这个事件循环相当于一种轮询的作用。既然是无限循环,当然在开启了事件循环的地方,代码就会被阻塞,后面的语句也就不会被执行到。

QDialog::exec()是有返回值的,其返回值是QDialog::Accepted或者QDialog::Rejected。对于使用了exec()显示的模态对话框,我们可以在exec()函数之后直接从对话框的对象获取到数据值。


标准消息对话框(QMessageBox):

标准对话框主要指QT内置的常用对话框,标准对话框大致分为以下几类:
QColorDialog:选择颜色;
QFileDialog:选择文件或者目录;
QFontDialog:选择字体;
QInputDialog:允许用户输入一个值,并将其值返回;
QMessageBox:模态对话框,用于显示信息、询问问题等;
QPageSetupDialog:为打印机提供纸张相关的选项;
QPrintDialog:打印机配置;
QPrintPreviewDialog:打印预览;
QProgressDialog:显示操作过程。

其中,QMessageBox为标准消息对话框,用于显示消息提示。

#include "mainwindow.h"
#include <QApplication>
#include <QMessageBox>
#include <QDebug>
#include <QObject>


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    QMessageBox msgBox;
    msgBox.setText("The document has been modified.");
    msgBox.setInformativeText("Do you want to save your changes");
    //会自动生成一个show details按钮,根据平台不同出现在按钮中的不同位置。
    msgBox.setDetailedText("Differences here...");
    msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
    msgBox.setDefaultButton(QMessageBox::Save);

    int ret = msgBox.exec();
    switch (ret) {
    case QMessageBox::Save:
        qDebug() << "Save document";
        break;
    case QMessageBox::Discard:
        qDebug() << "Discard changes";
        break;
    case QMessageBox::Cancel:
        qDebug() << "Close document";
        break;
    }


    return a.exec();
}

运行效果:


猜你喜欢

转载自blog.csdn.net/qq_20304723/article/details/80497579