Qt学习日志 - 第二章

本文介绍了如何使用Qt Designer创建对话框,包括手动编码和使用可视化工具创建FindDialog,详细讲解了信号和槽机制,以及如何通过连接实现功能。此外,还探讨了Qt Designer中的布局管理、信号槽连接、对象的生命周期以及如何测试对话框。最后,文章提到了可扩展对话框的概念,并展示了如何设计和实现一个扩展对话框。
摘要由CSDN通过智能技术生成

 

创建对话框

接下来我们用两种方法来创建一个对话框,一种是纯手工编码,一种是用Qt Designer(一种可视化的工具)来创建。

 

第一个例子是建立一个查找对话框。

 

创建两个文件finddialog.h finddialog.cpp

 

一下是finddialog.h

 

1 #ifndef FINDDIALOG_H   
2 #define FINDDIALOG_H
 
3 #include <QDialog>  
 
4 class QCheckBox; 
5 class QLabel;
6 class QLineEdit;
7 class QPushButton;

 

12行避免头文件被多次包含

3行包含QDialog类的定义,是Qt中所有对话框的基类, QDialog继承与QWidget.

47行是这个类定义中的前向申明。 前向申明(forward declaration)告诉C++编译器这个类存在,而不包含这个类的详细的定义,通常这个定义在这个类的额头文件中,这样加快编译速度。

 

接下来我们定义FindDialog

8 class FindDialog : public QDialog

 9 {

10     Q_OBJECT

 

11 public:

12     FindDialog(QWidget *parent = 0);

 

Q_OBJECT是一个宏,对于所有需要定义信号和槽的类,这个宏必须放在此类定义的开头。

FindDialog构造函数是一个典型的Qt widget类。 Parent参数用于指定父widget.默认值是null,意味着这个对话框没有父窗口。

 

13 signals:

14     void findNext(const QString &str, Qt::CaseSensitivity cs);

15     void findPrevious(const QString &str, Qt::CaseSensitivity cs);

 

signals部分定义2个信号,当用户点击Find按钮,这两个信号会被发射。如果向后搜索被选中,对话框发射findPrevious()信号,反过来发射findNext()信号。

Signals关键字其实就是一个宏。C++预处理器会把这个宏转换为标准的C++代码。Qt::CaseSensitivity是一个枚举类型,可以是Qt::CaseSensitive和Qt::CaseInsensitive.

 

16 private slots:
17     void findClicked();
18     void enableFindButton(const QString &text);
 
19 private:
20     QLabel *label;
21     QLineEdit *lineEdit;
22     QCheckBox *caseCheckBox;
23     QCheckBox *backwardCheckBox;
24     QPushButton *findButton;
25     QPushButton *closeButton;
26 };
 
27 #endif

 

private部分我们定义了2个槽函数。Slots关键字跟signals一样是一个宏。

 

接下来看看finddialog.cpp文件,里面包含finddialog类的具体实现。

1 #include <QtGui>

 

2 #include "finddialog.h"

 

首先我们包含了<QtGui>, 这是一个头文件里面包含了所有Qt GUI类的定义。

Qt由很多模块组成,每个模块都有自己的库。最重要的几个模块是 QtCore, QtGui, QtNetwork, QtOpenGL, QtScript, QtSql, QtSvg和QtXml。<QtGui>头文件包含了所有QtGui模块和一部分QtCore模块中的类。包含这个类我们就不需要单独的一个一个去包含我们需要用到的类了。

finddialog.h头文件中,我们也可以简单的包含<QtGui>,但这不是一个好的编程风格,<QtGui>是一个很大的头文件,在一个头文件中包含另一个大的头文件会大大降低编译速度。所以这里我们只包含<QDialog>,再用几个前向申明来代替。

3 FindDialog::FindDialog(QWidget *parent)

 4     : QDialog(parent)

 5 {

 6     label = new QLabel(tr("Find &what:"));

 7     lineEdit = new QLineEdit;

 8     label->setBuddy(lineEdit);

 

 9     caseCheckBox = new QCheckBox(tr("Match &case"));

10     backwardCheckBox = new QCheckBox(tr("Search &backward"));

 

11     findButton = new QPushButton(tr("&Find"));

12     findButton->setDefault(true);

13     findButton->setEnabled(false);

 

14                    closeButton = new QPushButton(tr("Close"));

 

4行把parent参数传给基类QDialog.然后创建一个QLabel。函数tr()用于把字符串转换为其他语言。tr()在QOject类中定义以及所有包含Q_OBJECT宏的子类。这是一个很好的编程习惯,把所有用户可见的字符串用函数tr()进行转换,即使目前你还没有计划把程序转换为其他语言。在第18章中我们还会讲。

字符串中&代表快捷键。例如第11行中创建一个Find按钮,用户按下Alt+F可以触发一个按钮事件。&符号还可以用来控制焦点:第6行我们创建一个label,快捷键为Alt+W,在第8行我们设置label的密友(buddy)为line editor.当label的快捷键按下后,它的密友widget就得到焦点。所以当用户按下Alt+W时,line editor得到焦点。

12行我们设置Find按钮为对话框的默认按钮,即当用户按下Enter时,默认按钮被触发。

13行使Find按钮不起作用,通常显示灰色,不会响应用户操作。

 

15   connect(lineEdit, SIGNAL(textChanged(const QString &)),

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值