对话框是 GUI 程序中不可或缺的组成部分。很多不能或者不适合放入主窗口的功能组件都必须放在对话框中设置。对话框通常会是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。尽管 Ribbon 界面的出现在一定程度上减少了对话框的使用几率,但是,我们依然可以在最新版本的 Office 中发现不少对话框。因此,在可预见的未来,对话框会一直存在于我们的程序之中。
Qt 使用 QDialog::exec()实现应用程序级别的模态对话框,使用 QDialog::open()实现窗口级别的模态对话框,使用 QDialog::show()实现非模态对话框。回顾一下我们的代码,在上面的示例中,我们调用了 exec()将对话框显示出来,因此这就是一个模态对话框。当对话框出现时,我们不能与主窗口进行任何交互,直到我们关闭了该对话框。
Qt 中使用 QDialog 类实现对话框。就像主窗口一样,我们通常会设计一个类继承 QDialog。QDialog(及其子类,以及所有 Qt::Dialog 类型的类)的对于其 parent 指针都有额外的解释:如果 parent 为 NULL,则该对话框会作为一个顶层窗口,否则则作为其父组件的子对话框(此时,其默认出现的位置是 parent 的中心)。顶层窗口与非顶层窗口的区别在于,顶层窗口在任务栏会有自己的位置,而非顶层窗口则会共享其父组件的位置。
对话框分为模态对话框和非模态对话框。所谓模态对话框,就是会阻塞同一应用程序中其它窗口的输入。模态对话框很常见,比如“打开文件”功能。你可以尝试一下记事本的打开文件,当打开文件对话框出现时,我们是不能对除此对话框之外的窗口部分进行操作的。与此相反的是非模态对话框,例如查找对话框,我们可以在显示着查找对话框的同时,继续对记事本的内容进行编辑。
Qt 使用 QDialog::exec()实现应用程序级别的模态对话框,使用 QDialog::open()实现窗口级别的模态对话框,使用 QDialog::show()实现非模态对话框。回顾一下我们的代码,在上面的示例中,我们调用了 exec()将对话框显示出来,因此这就是一个模态对话框。当对话框出现时,我们不能与主窗口进行任何交互,直到我们关闭了该对话框。
#include "mainwindow.h"
#include <QAction>//动作
#include <QMenuBar>//菜单栏
#include <QMessageBox>//消息提示框
#include <QToolBar>//工具栏
#include <QStatusBar>//状态栏
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
this->setWindowTitle("呵呵");
this->setMinimumSize(300,300);
/*
* 在 QAction 构造函数,我们传入了一个图标、一个文本和 this 指针。
* 图标我们使用了 QIcon,传入值是一个字符串,这个字符串对应于 Qt 资源文件中的一段路径。
* 以 : 开始,意味着从资源文件中查找资源。
* QAction 第二个参数中,文本值前面有一个 &,意味着这将成为一个快捷键。
* 下面一句,我们使用了 setShortcut() 函数,用于说明这个 QAction 的快捷键。 Qt 的
* QKeySequence 为我们定义了很多内置的快捷键,比如我们使用的 Open。
* setStatusTip() 则实现了当用户鼠标滑过这个 action 时,会在主窗口下方的状态栏显示相应的提示。
*后面的 connect() 函数, 将这个 QAction 的 triggered() 信号与 MainWindow 类的
* open() 函数连接起来。当用户点击了这个 QAction 时,会自动触发 MainWindow 的 open() 函数。
*/
openaction=new QAction(QIcon(":/new/prefix1/myico"),tr("&打开文件"),this);
openaction->setShortcuts(QKeySequence::Open);
openaction->setStatusTip(tr("open an existing file"));
connect(openaction,&QAction::triggered,this,&MainWindow::open);
/*
*下面的 maneBar()、 toolBar() 和 statusBar() 三个是 QMainWindow 的函数,用于创建并返回
* 菜单栏、工具栏和状态栏。我们可以从代码清楚地看出,我们向菜单栏添加了一个 File 菜单,
* 并且把这个 QAction 对象添加到这个菜单;同时新增加了一个 File 工具栏,也把 QAction 对
* 象添加到了这个工具栏。我们可以看到,在菜单中,这个对象被显示成一个菜单项,在工具栏变
* 成了一个按钮。至于状态栏,则是出现在窗口最下方,用于显示动作对象的提示信息的
*/
/*
* menuBar() 是 QMainWindow提供的函数,因此你是不会在 QWidget 或者 QDialog 中找到它的。
* 这个函数会返回窗口的菜单栏, 如果没有菜单栏则会新创建一个。QMenuBar 代表的是窗口
* 最上方的一条菜单栏。我们使用其 addMenu() 函数为其添加菜单。
* QToolBar 就是工具栏。我们使用的是 addToolBar()函数添加新的工具栏。
* 为什么前面一个是 menuBar() 而现在的是 addToolBar() 呢?因为一个窗口只有一个菜单栏,
* 但是却可能有多个工具栏。
*/
QMenu *file=menuBar()->addMenu(tr("&文件"));
file->addAction(openaction);
QMenu *file2=menuBar()->addMenu(tr("&主页"));
file2->addAction(openaction);
QToolBar *toolbar=addToolBar(tr("&File"));
toolbar->addAction(openaction);
QStatusBar *statusbar=statusBar();
statusbar->addAction(openaction);
}
void MainWindow::open(){
QDialog dlg;
dlg.setWindowTitle("嘿嘿");
/*
* Qt 使用 QDialog::exec() 实现应用程序级别的模态对话框,使用 QDialog::open() 实现窗口级别的
* 模态对话框,使用 QDialog::show() 实现非模态对话框。
*/
dlg.exec();
}
/*
* 非模态对话框,在堆上建立
* setAttribute() 函数设置对话框关闭时,自动销毁对话框。
* void MainWindow::open()
* {
* QDialog *dialog = new QDialog;
* dialog->setAttribute(Qt::WA_DeleteOnClose); // 或者 dialog->deleteLater();
* dialog->setWindowTitle(tr("Hello, dialog!"));
* dialog->show();
* }
*/
MainWindow::~MainWindow()
{
}