OpenSource版的QT4 Designer功能比较少,只能只能设计窗体布局以及连接已有的信号与槽,因此需要手动添加一些代码,不是很容易上手,今天试验了一下午,终于搞定了,写篇文章给QT初学者们参考,互相学习。

WindowsQT的安装可以参考我博客上的转帖《Eclipse + MinGW + Qt开发环境设置》,安装成功后会在开始菜单中出现“QT Designer”,打开后的界面如下所示:

 

     界面分为几个部分,最常用的是左边的工具箱和右边的属性窗口、信号/槽编辑器。

      下面就开始创建第一个QT程序QTDemo。这个程序是一个最简单的对话框程序,对话框上有一个按钮,点击该按钮后退出应用程序。

 一、创建用户界面

     首先创建一个对话框,“文件”->“新建”,选择“Dialog without Buttons”,创建一个不带任何部件的对话框:

 

     拖拽一个Push Button到对话框中,双击该按钮,将按钮文本改为Exit

 

     在右侧的属性窗口中将objectName改为Form 这将影响到自动生成的头文件中的类名:

 

     点击信号/槽编辑器中的“+”,添加pushButton的一个信号clicked(),并把该信号连接到Formclose()槽上:

 

     完成以上设置后将文件保存为form1.ui

二、设置QTminGW路径

      由于需要用到一些工具程序,为了方便起见,将程序路径添加到环境变量Path中,右击“我的电脑”->“属性”->“环境变量”,找到“Path”变量,在变量值最后添加:

     ;E:"Qt"4.4.3"bin;E:"MinGW"bin

 

三、生成头文件

工具程序uic可以根据ui文件自动生成.h文件,以供编程使用。在命令行窗口中,首先进入form1.ui所在文件夹,输入以下命令:

uic –o form1.h form1.ui

运行完后将会生成一个form1.h头文件,内容如下(函数内容省略):

     #ifndef FORM1_H
     #define FORM1_H

     #include <QtCore/QVariant>
     #include <QtGui/QAction>
     #include <QtGui/QApplication>
     #include <QtGui/QButtonGroup>
     #include <QtGui/QDialog>
     #include <QtGui/QPushButton>

     QT_BEGIN_NAMESPACE

     class Ui_Form
     {
     public:
         QPushButton *pushButton;
         void setupUi(QDialog *Form)
         {
               …
         } // setupUi

         void retranslateUi(QDialog *Form)
         {
               …
         } // retranslateUi
     };

     namespace Ui {
         class Form: public Ui_Form {};
     } // namespace Ui

     QT_END_NAMESPACE

     #endif // FORM1_H

    最好不要修改这个文件,因为每次修改了ui文件后再重新生成头文件时,所做的修改将都会丢失。下面简要分析一下这个文件:

1)首先声明了一个类Ui_Form,该类中包含了一个QPushButton对象和两个成员方法

2)其次声明了一个名字空间Ui,其中包含了一个类Form

3)类Form继承了类Ui_Form,但是并没有增加什么新的内容,这样做的目的仅仅是为了将比较怪异的类名Ui_Form改为Form,这样在其他文件中直接使用Form类就行了

四、添加自定义代码

1.新建一个头文件MyDlg.h,内容如下:

     #ifndef __DLG_H__
     #define __DLG_H__

     #include <QDialog.h>
     #include <form1.h>

     class MyDlg : public QDialog
     {
     Q_OBJECT
     public:
         MyDlg(); 
     private:
         Ui::Form ui;
     };

     #endif

该头文件首先包含了form1.h,然后声明了一个类MyDlg,并添加了一个私有成员对象Ui::Form ui,这样就可以通过该对象控制界面上的所有部件了。

2.新建一个C++文件MyDlg.cpp,内容如下:

     #include "MyDlg.h"

     MyDlg::MyDlg()
     {
         ui.setupUi(this);
         QObject::connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(close()));
     }
 

在类MyDlg的构造方法中首先调用uisetupUi()方法,对界面上的部件进行初始化,然后将pushButtonclick()信号和对话框的close()槽连接起来。

3.新建一个C++文件main.cpp,写主函数,内容如下:

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

     int main(int argc, char **argv)
     {
         QApplication app(argc, argv);
         MyDlg *mydlg= new MyDlg;
         return mydlg->exec();
     }     
 

首先创建一个Qapplication对象app,然后创建一个MyDlg对象mydlg,最后调用mydlgexec()方法使其进入窗口消息循环。

五、编译工程

1.生成工程文件

进入程序所在目录,在命令行窗口中输入以下命令:

qmake –project

运行后将生成工程文件QTDemo.pro,内容如下:

     TEMPLATE = app
     TARGET = 
     DEPENDPATH += .
     INCLUDEPATH += .

     # Input
     HEADERS += form1.h MyDlg.h
     FORMS += form1.ui
     SOURCES += main.cpp MyDlg.cpp

该文件归类了程序中的所有文件。

2.编译工程

在命令行中输入qmake,生成Makefile文件

在命令行中输入make,编译整个工程,生成QTDemo.exe

六、QT国际化(i18n

要使得应用程序支持多种语言,并且能够灵活切换,就需要添加QT的国际化支持。

打开QTDemo.pro,添加如下语句:

TRANSLATIONS += en.ts zh_CN.ts zh_TW.ts

然后在命令行窗口中输入以下命令:

lupdate QTDemo.pro

这样就生成了3个语言文件:en.tszh_CN.tszh_TW.ts,分别存放英文、中文、繁体中文的字符串。en.ts的内容如下:

     <?xml version="1.0" encoding="utf-8"?>
     <!DOCTYPE TS><TS version="1.1">
     <context>
         <name>Form</name>
         <message>
             <location filename="form1.ui" line="13"/>
             <source>Dialog</source>
             <translation type="unfinished"></translation>
         </message>
         <message>
             <location filename="form1.ui" line="25"/>
             <source>Exit</source>
             <translation type="unfinished"></translation>
         </message>
     </context>
     </TS>
 

这是一个XML文件,其中存放了所有工程中涉及到的字符串。

linguist(在QT安装目录下的bin目录中)打开zh_CN.ts,选择“编辑”->“翻译文件设置”,选择Chinese/China

      选中某一个字符串,在译文文本框中输入对应于中文的字符串:

      在翻译完成后一定要记得点击一下字符串前面的“?”,使其变成一个“√”:

    最后选择“文件”->“另外发布为”,将语言文件发布为zh_CN.qm文件

用同样的方法生成zh_TW.qm文件,唯一不同的地方就是翻译文件设置中应该选择Chinese/Taiwan。对于en.ts文件,不需要翻译,直接发布为en.qm即可。

下面在程序中添加对国际化的支持,将main.cpp修改为如下内容:

     #include <QApplication>
     #include <QTranslator>
     #include "MyDlg.h"

     int main(int argc, char **argv)
     {
         QApplication app(argc, argv);
         QTranslator translator;
         translator.load(QString(argv[1]));
         app.installTranslator(&translator);
         MyDlg *mydlg = new MyDlg;
         return mydlg->exec();
     }    

 

重新执行make命令,生成可执行程序。

在运行程序时通过传递命令行参数指定所使用的语言,注意不需要指定扩展名.qm,例如:

QTDemo zh_CN

这样运行程序时界面就编程中文的了,是不是很简单啊~

七、添加自定义槽(slot

    上面使用的都是系统定义的槽,如果希望在点击某个按钮后产生特定的动作,则需要自定义槽。首先在QT Designer中再添加一个按钮,对象名为pushButton_2,按钮文本为ShowInfo,点击该按钮后会弹出一个消息框,显示HelloWorld

 

然后修改MyDlg.h,添加自定义槽ShowInfo()

     #ifndef __DLG_H__
     #define __DLG_H__

     #include <QDialog.h>
     #include <form1.h>

     class MyDlg : public QDialog
     {
     Q_OBJECT
     public:
         MyDlg();
     public slots:
         void ShowInfo();   
     private:
         Ui::Form ui;
     };

     #endif

再修改MyDlg.cpp,将pushButton_2click()信号和对话框的ShowInfo()槽连接起来,并且添加消息响应代码ShowInfo()

     #include <QMessageBox>
     #include "MyDlg.h"

     MyDlg::MyDlg()
     {
         ui.setupUi(this);
         QObject::connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(close()));
         QObject::connect(ui.pushButton_2, SIGNAL(clicked()), this, SLOT(ShowInfo()));
     }

     void MyDlg::ShowInfo()
     {
         QMessageBox::information(this, tr("Hello"), tr("Hello World"), tr("OK"));
     }

修改完毕后按照本文所介绍的步骤编译工程,即可将自定义槽添加到应用程序中,运行结果如下: