第八章 Qt GUI之对话框使用

对话框可以是模态(modal)的或非模态(modeless)两种。当我们在一个用户界面程序里面对一个对话框(比如选择文件对话框)的操作没有结束前,界面的其他窗口无法操作,遇到的这个对话框就是模态对话框,而当我们在一个字处理软件中利用查找和替换对话框时,可以在字处理软件和查找替换对话框之间切换进行交互,这就是个非模态对话框。

先来看一下QDialog类的继承关系,如下图所示。

QDialog从QWidget继承,然后它下面又被Qt的内置对话框类(QFileDialog选择文件或目录对话框、QFontDialog选择字体对话框、QMessageBox消息提示对话框等)继承。用户要实现自己的对话框,需要继承自QDialog类,并包含头文件<QDialog>。

1、实现自己的对话框类

实现一个Find(查找对话框),它的运行效果如下图所示,这将实现一个拥有自主权的对话框。

程序清单如下:

finddialog.h

 1 #ifndef FINDDIALOG_H
 2 #define FINDDIALOG_H
 3
 4 #include <QDialog>
 5 #include <QCheckBox>
 6 #include <QLabel>
 7 #include <QLineEdit>
 8 #include <QPushButton>
 9
10 class FindDialog : public QDialog
11 {
12     Q_OBJECT
13
14 public:
15     FindDialog(QWidget *parent = 0);
16     ~FindDialog();
17
18 signals:
19     void findNext(const QString &str, Qt::CaseSensitivity cs);
20     void findPrevious(const QString &str, Qt::CaseSensitivity cs);
21
22 private slots:
23     void findClicked();
24     void enableFindButton(const QString &text);
25
26 private:
27     QLabel *label;
28     QLineEdit *lineEdit;
29     QCheckBox *caseCheckBox;
30     QCheckBox *backwardCheckBox;
31     QPushButton *findButton;
32     QPushButton *closeButton;
33 };
34
35 #endif // FINDDIALOG_H

finddialog.cpp:

 1 #include <QtGui>
 2 #include "finddialog.h"
 3
 4 FindDialog::FindDialog(QWidget *parent)
 5     : QDialog(parent)
 6 {
 7     label = new QLabel(tr("Find &what")); //tr()函数是把它们翻译成其他语言的标志,“&”来表示快捷键(Alt+W)
 8     lineEdit = new QLineEdit;
 9     label->setBuddy(lineEdit);//设置行编辑器为标签的伙伴,按下标签的快捷键(Alt+W)时接收焦点,焦点会移动到行编辑器
10
11     caseCheckBox = new QCheckBox(tr("Math &case"));
12     backwardCheckBox = new QCheckBox(tr("Search &backward"));
13
14     findButton = new QPushButton(tr("&Find"));
15     findButton->setDefault(true);//设置“Find”按钮为默认按钮,默认按钮就是当用户Enter键时能够按下对应的按钮
16     findButton->setEnabled(false);//禁用“Find”按钮,它通常显示为灰色,不能和用户进行交互操作
17
18     closeButton = new QPushButton(tr("Close"));
19
20     connect(lineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(enableFindButton(const QString &)));
21     connect(findButton, SIGNAL(clicked()), this, SLOT(findClicked()));
22     connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));
23
24     QHBoxLayout *topLeftLayout = new QHBoxLayout;
25     topLeftLayout->addWidget(label);
26     topLeftLayout->addWidget(lineEdit);
27
28     QVBoxLayout *leftLayout = new QVBoxLayout;
29     leftLayout->addLayout(topLeftLayout);
30     leftLayout->addWidget(caseCheckBox);
31     leftLayout->addWidget(backwardCheckBox);
32
33     QVBoxLayout *rightLayout = new QVBoxLayout;
34     rightLayout->addWidget(findButton);
35     rightLayout->addWidget(closeButton);
36     rightLayout->addStretch();
37
38     QHBoxLayout *mainLayout = new QHBoxLayout;
39     mainLayout->addLayout(leftLayout);
40     mainLayout->addLayout(rightLayout);
41     setLayout(mainLayout); //将mainLayout布局安装在FindDialog
42
43     setWindowTitle(tr("Find"));
44     setFixedHeight(sizeHint().height());
45 }
46
47 void FindDialog::findClicked()
48 {
49     QString text = lineEdit->text();
50     Qt::CaseSensitivity cs = caseCheckBox->isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive;
51     if (backwardCheckBox->isChecked())
52     {
53         emit findPrevious(text, cs);
54     }
55     else
56     {
57         emit findNext(text, cs);
58     }
59 }
60
61 void FindDialog::enableFindButton(const QString &text)
62 {
63     findButton->setEnabled(!text.isEmpty());
64 }
65
66 FindDialog::~FindDialog()
67 {
68
69 }

main.cpp

#include <QApplication>
#include "finddialog.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    FindDialog *w = new FindDialog;
    w->show();

    return a.exec();
}

编译运行就出现上图效果了。

时间: 2024-08-27 15:02:16

第八章 Qt GUI之对话框使用的相关文章

QT学习 之 对话框 (四) 字体对话框、消息对话框、文件对话框、进程对话框(超详细中文注释)

QMessageBox类: 含有Question消息框.Information消息框.Warning消息框和Critical消息框等 通常有两种方式可以来创建标准消息对话框: 一种是采用“基于属性”的API,一种是使用QMessageBox的静态方法. 后者书写容易,但缺少灵活性,针对用户给出的提示的信息不够丰富,并且不能自定义消息对话框里面的按钮提示信息.因此推荐第一种写法. [cpp] view plaincopy <span style="font-size:18px;"&

QT 打开文件对话框总结

Qstring fileName = QFileDialog::getOpenFileName(this, tr("open file"), " ",  tr("Allfile(*.*);;mp3file(*.mp3)")); 说明:这样就会产生一个对话框,和系统的资源管理器差不多的.返回的是你选择文件的 绝对路径. 参数1:父窗口 参数2:对话框的标题 参数3:默认的打开的位置,如"我的文档"等 参数4:文件的过滤器,注意文

Qt打开文件对话框

项目中需要打开文件对话框,就查了一下,不得不说Qt的帮助文档做的真好,非常详细.要实现这个功能有两种方式,使用QFileDialog的静态方法,实例化QFileDialog对象. 基本算是照抄帮助文档了.下面是自己的代码. 1 // 单击文件按钮 2 void FirstDialog::on_pushButtonFile_clicked() 3 { 4 QString strFile = QFileDialog::getOpenFileName( 5 this, 6 tr("打开文件"

Qt Gui中父控件监听子控件的IO事件

父对象重新定义自己继承自QObject的函数bool eventFilter(QObject* watched, QEvent* event). 子控件安装父对象的eventFilter: 例如, QTableView * itsView = new QTableView; itsView->viewport()->installEventFilter(this); Qt Gui中父控件监听子控件的IO事件

QT创建模态对话框阻塞整个应用程序和非模态对话框唯一性约束的简单示例

QT创建模态对话框阻塞整个应用程序和非模态对话框唯一性约束的简单示例 部分代码: // 创建模态对话框阻塞整个应用程序和非模态对话框唯一性约束 QMenu *pDialog = mBar->addMenu(QString::fromLocal8Bit("对话框")); QAction *pTopDialog = pDialog->addAction(QString::fromLocal8Bit("模态对话框")); connect(pTopDialog,

QT之消息对话框

我们会经常见到一些标准对话框,Qt 也为开发者提供了一些可复用的对话框类型. Qt 提供的可复用对话框全部继 QDialog 类,关系如下图所示:Qt 中的标准对话框遵循相同的使用方式,大概流程如下:那么我们的消息对话框是应用程序中最常见的界面元素,主要用于:1.为用户提示重要信息:2.强制用户进行操作选择.如我们平时所见的画图时的对话框,如下:那么我们消息对话框的使用方式是怎样的呢?如下所示:我们在实验中设置四个按钮,头文件如图所示:我们构建运行会得到如下图所示的效果图:QMessageBox

QT GUI @创建新的工程

开发环境: Qt 4.5 Qt Creator 1.3.0 新工程创建步骤: 1. 单击运行Qt Creator,进入欢迎页面.选择"File" -> "New File or Project..."; 2. 在弹出的窗口中选择“Qt4 Gui Application”,单击OK,下一步: 3. 选择保存项目的路径以及定义自己项目的名字(路径不要有中文和空格),下一步: 4. 出现“Select required modules”界面.然后根据自己需要添加一些

关于Qt中的对话框无缘无故弹出两次的问题

今天,用Qt在做一个多线程程序的时候,遇到了一点小障碍.这个程序的功能是这样的,打开文件夹选择对话框,选择多个txt文件.然后后台对这多个txt文件写入"hello world",当写好一个文件时GUI上显示写好文件的名称. 程序做完看似很好的样子,可是每次在选择完文件点击"打开"后选择文件的对话框又会弹出来.搞了好久没有解决这个问题,终于刚刚我知道怎么回事了.在这里为自己做个笔记,有需要的也可以看看. 小小的回忆下自己做这个工程的过程,首先建立工程文件,然后进入Q

qt——QFileDialog使用对话框选取本地文件

QT在学习的过程中总是遇到各种问题,没有人解答,只有自己在研究并且在网上搜索一些资料,从初学到现在入门,一直都是这样走过来的,虽然走得很艰难,但是每一个阶段都会有所收获,最近在做一个图片浏览模块的功能,需要实现一个图片修改以后把图片另存为的功能,刚开始觉得挺麻烦,查找资料的时候也觉得很繁琐,很多资料都不是很详细,花费了我两天的时间我才将这个功能给实现了,到最后发现这个功能实现实际很简单,知识自己不了解QFileDialog控件和它的用法,导致白白浪费了这么多时间,不过也在这个过程中对QFileD