魔方网表 让信息化更简单

 找回密码
 注册
查看: 8278|回复: 2

Qt系列教程【2.3】快速设计对话框(Rapid Dialog Design)

[复制链接]
admin 发表于 2008-11-24 13:03:00 | 显示全部楼层 |阅读模式
通常程序员们都是用c++源代码编写Qt应用程序,Qt也是很容易用来编写的。然而,许多程序员更喜欢用可视化的方法设计对话框,这样能更快速更容易对对话框进行修改。
Qt Designer满足了程序员的这一要求,提供了可视化设计对话框的方法。它可以给一个应用程序提供全部或者部分对话框。用Qt Designer设计的对话框和用c++代码写成的对话框是一样的,可以用做一个常用的工具,并不对编译器有什么特殊要求。
在这一节中,我们使用Qt Designer创建Go-to-Cell对话框,无论用编写代码的方式还是用Qt Designer,创建对话框都有如下基本的步骤:
1、创建和初始化子控件。
2、把子控件放到布局管理器中。
3、设置tab顺序。
4、创建信号和槽连接。
5、实现对话框自己的槽函数。

在windows平台Qt的安装目录的bin目录下,点击desinger.exe,或者在unix平台,在命令行上输入designer。当Qt Designer启动后,它会列出一个控件模板的列表,选择一个"Widget"模板,进入设计。
假如设计好的文件保存在gotocell目录中,命名为gotocelldialog.ui中,然后在同一个目录下创建一个main.cpp文件,编码如下:
  1. #include
  2. #include
  3. #include "ui_gotocelldialog.h"
  4. int main(int argc, char *argv[])
  5. {
  6. QApplication app(argc, argv);
  7. Ui::GoToCellDialog ui;
  8. QDialog *dialog = new QDialog;
  9. ui.setupUi(dialog);
  10. dialog->show();
  11. return app.exec();
  12. }
复制代码
保存后,在该目录下运行qmake,创建.pro文件和makefile文件(运行qmake -project;qmake goto-cell.pro)。qmake工具可以发现gotocelldialog.ui文件,然后就会调用uic(Qt的用户界面编译器)生成恰当的makefile规则,uic工具把gotocelldialog.ui转换成c++代码,并将结果保存在ui_gotocelldialog.h中。
在ui_gotocelldialog.h中,包含了Ui::GoToCellDialog类的定义,这个类和gotocelldialog.ui等价。这个类声明成员变量用来存储对话框的子控件和布局管理器,setupUi()函数初始化对话框
这个类的定义看起来有点象下面这个样子:
  1. class Ui::GoToCellDialog
  2. {
  3. public:
  4. QLabel *label;
  5. QLineEdit *lineEdit;
  6. QSpacerItem *spacerItem;
  7. QPushButton *okButton;
  8. QPushButton *cancelButton;
  9. ...
  10. void setupUi(QWidget *widget) {
  11. ...
  12. }
  13. };
复制代码
这个类没有从任何Qt类中继承。在main.cpp中使用该对话框时,要创建一个QDialog,把它传递给setupUi()函数。
运行这个程序,对话框将会显示出来,但是有些功能它还不能实现:
1、Ok按钮是不可用状态的
2、Cancel按钮不作任何事情
3、编辑框除可以输入许可的字符或者数字外,还可以输入任何文本
我们可以编写代码,让这个对话框变得有用起来。最直接的方法是创建一个新类,从QDialog和Ui::GoToCell-Dialog两个类派生,完成缺少的功能。(这说明任何软件问题可以通过添加一层间接包装来简单解决)。通常命名新类规则是用uic生成的类名去掉Ui::前缀后的名字
创建gotocelldialog.h头文件,写下如下代码:
  1. #ifndef GOTOCELLDIALOG_H
  2. #define GOTOCELLDIALOG_H
  3. #include
  4. #include "ui_gotocelldialog.h"
  5. class GoToCellDialog : public QDialog, public Ui::GoToCellDialog
  6. {
  7. Q_OBJECT
  8. public:
  9. GoToCellDialog(QWidget *parent = 0);
  10. private slots:
  11. void on_lineEdit_textChanged();
  12. };
  13. #endif
复制代码
新建gotocelldialog.cpp源文件,实现这个类:
  1. #include
  2. #include "gotocelldialog.h"
  3. GoToCellDialog::GoToCellDialog(QWidget *parent)
  4. : QDialog(parent)
  5. {
  6. setupUi(this);
  7. QRegExp regExp("[A-Za-z][1-9][0-9]{0,2}");
  8. lineEdit->setValidator(new QRegExpValidator(regExp, this));
  9. connect(okButton, SIGNAL(clicked()), this, SLOT(accept()));
  10. connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject()));
  11. }
  12. void GoToCellDialog::on_lineEdit_textChanged()
  13. {
  14. okButton->setEnabled(lineEdit->hasAcceptableInput());
  15. }
复制代码
在构造函数中,我们调用setupUi()初始化这个对话框。由于多继承,我们可以直接使用Ui::GoToCellDialog的成员。创建了用户界面以后,我们可以把子控件的信号和槽函数连接起来。
setupUi() 会自动按命名规则on_objectName_signalName()将任何槽与相应objectName对象名的signalName()信号连接起来。在本例中,即setupUi()会建立如下连接:
connect(lineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(on_lineEdit_textChanged()));
在构造函数中,我们还创建一个许可器(validator)限制编辑框输入的范围。Qt提供了三个许可器类:QIntValidator,QDoubleValidator和QRegExpValidator。这里我们使用了QRegExpValidator,使用的表达式为“[A-Za-z][1-9][0-9]{0,2}”这个表达式的意思是第一个字符输入为大写或者小写字母,第二个字符为范围从1到9的任一个数字,接下来是0个或一个或两个数字,范围均从0到9。正则表达式的介绍详见QRegExp类文档。
在QRegExpValidator的构造函数中,第二个参数为this,把当前类作为它的父控件,这样就可以不用删除它,父控件删除时它可以被自动删除。
Qt的父子机制在QObject中实现的。当我们创建一个带有父的对象(如一个子控件,一个许可器,布局管理器等)时,父对象把子对象放到自己的子对象列表中。父对象被删除时,它遍历子对象列表并把每一个子对象删除掉。这些子对象再把自己的子对象删除掉,如此递归,直到删除所有对象
这种父子对象的机制简化了内存管理,减少了内存泄漏的危险。需要程序员明确删除的对象就是我们使用new创建的没有父亲的对象。如果我们在父对象存在时删除了它的一个子对象,Qt将在其父对象的子对象列表中自动删除该子对象。(需要记住的是Qt只是删除有父的对象,父对象还是需要手动删除的,还有就是那些用new申请的没有指定父的内存,一般情况下,在对话框里的子控件,许可器和布局管理器由Qt自己管理,其他还要程序员小心删除)
对于控件来讲,父对象还有一个意义:子控件在父对象的显示区域内显示。当父控件删除后,子控件不但在内存中被删除,它也同时在屏幕上消失。
在构造函数的最后两行,把QDialog的accept()函数连接到OK按钮的点击信号,把Cancel按钮的点击信号连接到reject()函数。这两个槽函数都关闭这个对话框,但是accept()返回 QDialog::Accepted(值为1),reject()返回值为QDialog::Rejected(值为0)。不同的返回值可以判断用户点击了哪个按钮
on_lineEdit_textChanged()槽函数控制Ok按钮的使能状态,通过编辑框中的输入字符,如果字符有效Ok按钮则有效可用,否则为不可用状态。QLineEdit::hasAcceptableInput()根据我们在构造函数中设置的许可器返回bool值。
这就完成了这个对话框,现在重写这个main.cpp文件:
  1. #include
  2. #include "gotocelldialog.h"
  3. int main(int argc, char *argv[])
  4. {
  5. QApplication app(argc, argv);
  6. GoToCellDialog *dialog = new GoToCellDialog;
  7. dialog->show();
  8. return app.exec();
  9. }
复制代码
编译这个程序(qmake -project; qmake gotocell.pro)然后运行。输入“A12”,Ok按钮变为可用。试着输入一行随意字符,观察许可器的反映。点击Cancel按钮关闭这个对话框。
使用qt Designer可以不改变源程序的情况下改变对话框的设计。如果对话框用C++代码编写,改变它将会很费力的。使用Qt Designer,uic自动重新生成源文件。不会浪费任何时间。对话框的用户界面被保存在.ui 文件中 (一种基于 XML的文件格式), 通过从uic生成的类派生子类来实现自己的功能
twepj 发表于 2012-10-21 18:51:23 | 显示全部楼层
不错,楼主辛苦了(012meitu.com)支持你。
回复

使用道具 举报

斌睿高芳 发表于 2013-1-12 20:58:45 | 显示全部楼层
看过,的确不错。谢谢楼主
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|魔方软件 ( 京ICP备08008787号 )

京公网安备 11010702001722号

GMT+8, 2024-4-19 02:34 , Processed in 0.071344 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表