Qt中ui文件的使用(转载)

本文系转载,侵删,原文链接:http://blog.youkuaiyun.com/zzwdkxx/article/details/25823363

    用designer设计的*.ui文件可以通过uic工具转换为*.h文件(在编译时也会自动生成这样一个ui_*.h文件),有了这个.h文件就可以直接按照纯C++的方式对其中的类进行调用。ui文件的使用就是利用默认工具uic自动产生一个类,然后用该类的setui函数加载界面到相应的对象上。

      .ui文件的使用有三种形式:第一种是直接使用,第二种是定义一个新类,声明一个ui子对象,利用该对象来加载界面,第三种是将ui作为基类派生新的类。

      借用一个例程分析如下:

      工程及界面

                                                                                                            

 1 /***************************************dialog.h********************************************/
 2 
 3  
 4
 5 #ifndef DIALOG_H
 6 #define DIALOG_H
 7 
 8 #include <QDialog>
 9 
10 namespace Ui {
11                 class Dialog;      
12 
13 }
14 
15 /*为什么要使用这样一个命名空间呢?因为我们接着又要定义一个Dialog类,二者同名,所以才用了这个命名空间。此处的类Dialog继承自Ui_Dialog,属于一个前置声明,因为在dialog.h中我们有这么一句Ui::Dialog *ui; 使用了Ui::Dialog 来定义一个指针,但是这个Ui::Dialog并没有实际上进行定义(我们是在下文中的ui_dialog.h中定义的Dialog),也没有包含相关头文件,所以用了一个前置声明(关于前置声明此处略)*/
16 
17 class Dialog : public QDialog {        //又定义了一个Dialog类
18                 Q_OBJECT
19 public:
20                 Dialog(QWidget *parent = 0);
21                 ~Dialog();
22 
23 protected:
24                 void changeEvent(QEvent *e);
25 
26 private:
27                 Ui::Dialog *ui;        // 声明一个子类
28 
29 private slots:
30                 void on_pushButton_clicked();
31         };
32 
33 #endif // DIALOG_H
34 
35 红色部分声明一个类,将设计出来的ui界面作为该类的一个子对象,在其构造函数中,先完成对子对象的构造,再使用子对象ui调用其setupUi(this)函数实现ui的现实。
36 
37 Dialog::Dialog(QWidget *parent) :
38                 QDialog(parent),
39                 ui(new Ui::Dialog)
40         {
41                 ui->setupUi(this);   //加载界面
42         }

看完上面的代码,我们来分析下到底为什么要这样来使用ui文件。

在没有qtcreator之前,给了我们一个ui文件,该如何调用?

针对于ui文件,不知道大家知不知道uic这个工具,这是qt继承的一个工具,它可以利用ui生产.h文件。

uic  dialog.ui  –o  ui_dialog.h

就生产了下面的ui_dialog.h文件:

 1 /**************************************ui_dialog.h*******************************************/
 2 
 3 #ifndef UI_DIALOG_H
 4         #define UI_DIALOG_H
 5 
 6 #include <QtCore/QVariant>
 7         #include <QtGui/QAction>
 8         #include <QtGui/QApplication>
 9         #include <QtGui/QButtonGroup>
10         #include <QtGui/QDialog>
11         #include <QtGui/QHeaderView>
12         #include <QtGui/QLabel>
13         #include <QtGui/QPushButton>
14 
15 QT_BEGIN_NAMESPACE
16 
17 class Ui_Dialog
18         {
19         public:
20                 QLabel *label;
21                 QPushButton *pushButton;
22 
23         void setupUi(QDialog *Dialog)
24                 {
25                         if (Dialog->objectName().isEmpty())
26                         Dialog->setObjectName(QString::fromUtf8("Dialog"));
27                         Dialog->resize(115, 148);
28                         label = new QLabel(Dialog);
29                         label->setObjectName(QString::fromUtf8("label"));
30                         label->setGeometry(QRect(10, 30, 91, 21));
31                         QFont font;
32                         font.setPointSize(12);
33                         font.setBold(true);
34                         font.setWeight(75);
35                         label->setFont(font);
36                         pushButton = new QPushButton(Dialog);
37                         pushButton->setObjectName(QString::fromUtf8("pushButton"));
38                         pushButton->setGeometry(QRect(20, 80, 75, 23));
39 
40                 retranslateUi(Dialog);
41 
42                 QMetaObject::connectSlotsByName(Dialog);
43                 } // setupUi
44 
45         void retranslateUi(QDialog *Dialog)
46                 {
47                         Dialog->setWindowTitle(QApplication::translate("Dialog","Dialog",0,QApplication::UnicodeUTF8));
48                         label->setText(QApplication::translate("Dialog","hello,wang",0,QApplication::UnicodeUTF8));
49                         pushButton->setText(QApplication::translate("Dialog","close",0,QApplication::UnicodeUTF8));
50                 } // retranslateUi
51 
52 };
53 
54 namespace Ui {
55                 class Dialog: public Ui_Dialog {};    //此处定义了命名空间,其中定义了一个Dialog类,继承自Ui_Dialog类
56         } // namespace Ui
57 
58 QT_END_NAMESPACE
59 
60 #endif // TT_H

通过观察我们会发现uic自动将我们设计的ui文件,生成了一个类,在此例中为class Ui_Dialog。事实上也是这样,uic会自动会利用设计好的ui生成一个包含类Ui_**的ui_**.h文件。那么在此例中,就会将我们设计好的dialog就会被uic文件解析,生成一个叫做ui_dialog.h的文件,此文件中包含Ui_Dialog的类。

那么总结出来,要让ui design设计出来的界面显示出来,只要能设法调用Ui_Dialog类的setupUi函数就行了。

一种简单的方法,直接使用,重新写一个这样的main函数。

 1 #include <QtGui/QApplication>
 2 #include <QDialog>
 3 #include "ui_dialog.h"
 4 int main(int argc, char *argv[])
 5 {
 6         QApplication a(argc, argv);
 7         Ui::Dialog ui;
 8         QDialog *d=new QDialog;
 9         ui. setupUi(d);
10         d->show();
11         return a.exec();
12 }

第二种方法相对比较简单一点,就是将Ui::Dialog ui或Ui::Dialog *ui写成一个新定义类的一个数据成员,也就是qtcreator提供的那种方法。(也叫单继承方法,只继承了QDialog类)

 1 #include <QDialog>
 2 #include "ui_dialog.h"
 3 
 4 class Dialog : public QDialog {
 5                 Q_OBJECT
 6 public:
 7                 Dialog(QWidget *parent = 0);
 8                 ~Dialog();
 9 
10 protected:
11                 void changeEvent(QEvent *e);
12 
13 private:
14                 Ui::Dialog *ui;
15 
16 private slots:
17                 void on_pushButton_clicked();
18         };
19 这样使用的时候需要注意的是在初始化的时候要先完成子对象的初始化,在其构造函数中重写构造函数。
20 Dialog::Dialog(QWidget *parent) :
21                 QDialog(parent),
22                 ui(new Ui::Dialog)
23         {
24                 ui->setupUi(this);
25         }

第三种方法是以Ui_Dialog类为基类,派生一个新类,在该类的初始化函数中调用setupUi。(也叫多重继承方法,继承了QDialog类和Ui::Dialog类)

 1 #ifndef DIALOG_H
 2 #define DIALOG_H
 3 
 4 #include <QDialog>
 5 #include "ui_dialog.h"
 6 
 7 class Dialog : public QDialog ,public Ui::Dialog
 8 {
 9                 Q_OBJECT
10 public:
11                 Dialog(QWidget *parent = 0);
12 };
13 
14 实现如下:
15 
16 #endif // DIALOG_H
17 #include "dialog.h"
18 #include "ui_dialog.h"
19 
20 Dialog::Dialog(QWidget *parent) :
21                 QDialog(parent),
22                 Ui::Dialog()       
23         {
24                 setupUi(this);
25         }

附上一个直接使用ui_hellodialog.h的小例程

           

程序如下:

/**************************************ui_hellodialog.h*****************************************/
#ifndef UI_HELLODIALOG_H  
#define UI_HELLODIALOG_H  

#include <QtCore/QVariant>  
#include <QtGui/QAction>  
#include <QtGui/QApplication>  
#include <QtGui/QButtonGroup>  
#include <QtGui/QDialog>  
#include <QtGui/QHeaderView>  
#include <QtGui/QLabel>  
  
QT_BEGIN_NAMESPACE  
  
class Ui_HelloDialog  
{  
public:  
    QLabel *label;  
  
    void setupUi(QDialog *HelloDialog)  
    {  
        if (HelloDialog->objectName().isEmpty())  
            HelloDialog->setObjectName(QString::fromUtf8("HelloDialog"));  
        HelloDialog->resize(400, 300);  
        label = new QLabel(HelloDialog);  
        label->setObjectName(QString::fromUtf8("label"));  
        label->setGeometry(QRect(120, 120, 151, 31));  
  
        retranslateUi(HelloDialog);  
  
        QMetaObject::connectSlotsByName(HelloDialog);  
    } // setupUi  
  
    void retranslateUi(QDialog *HelloDialog)  
    {  
        HelloDialog->setWindowTitle(QApplication::translate("HelloDialog", "Dialog", 0, QApplication::UnicodeUTF8));  
        label->setText(QApplication::translate("HelloDialog", "Hello World! \344\275\240\345\245\275Qt\357\274\201", 0, QApplication::UnicodeUTF8));  
    } // retranslateUi  
  
};  
  
namespace Ui {  
    class HelloDialog: public Ui_HelloDialog {};  
} // namespace Ui  
  
QT_END_NAMESPACE  
  
#endif // UI_HELLODIALOG_H
 1 /****************************************main.cpp****************************************/
 2 #include "ui_hellodialog.h"
 3 int main(int argc, char *argv[])
 4 {
 5     QApplication a(argc, argv);
 6     QDialog w;
 7     Ui::HelloDialog ui;
 8     ui.setupUi(&w);
 9     w.show();
10     return a.exec();
11 }

转载于:https://www.cnblogs.com/blackeyes/articles/5233714.html

Qt中怎么用Ui文件 第一步, 制作ui文件。 首先应该用Qt Designer绘制一个自己的界面,并存为myform.ui(这里的myform可以用自己喜欢的名字代替)。 在制作自己的界面文件时要注意以下几个要点: 1、要记住ui文件的名字,因为uic生成的代码会存在ui_myform.h里 2、要记住主窗体的object name, 因为ui文件提供的类名将以这个form的名字来命名 3、要特别注意你的form选择的基类要和你代码中的窗体类兼容 4、要记得给每个后面需要访问到的控件起一个有意义并且好记的object name, 因为ui文件提供的控件将以这些object name来命名 清楚了以上几点,在代码中使用你的ui文件就会变得非常简单。 第二步,将ui文件加入工程 这一步最简单,只需要修改pro文件,加入FORMS+=myform.ui qmake -project命令也可以识别后缀名为ui文件,并将之加入工程。 第三步,在代码中引用ui文件 官方介绍的使用ui文件的方法有三种,一个是直接引用,二是单继承,三是多继承。 第一种方法其实很不实用,大家去看一下文档中的例子就可以了;第二种和第三种没有本质的差别,可以并作一类,这里做重点介绍。 ui文件最终会被翻译成标准的C++代码,并存入一个.h文件中,这个过程在调用make之后才进行,所以初始情况下你是看不到这个ui_myform.h文件的,只有经过了make过程该头文件才生成。不过没关系,没有这个文件我们照样能写出正确的代码。 单继承方式简单来说就是在代码中首先要自定义一个子类(后文称为MyForm),该类要从form对应的窗体类(或其兼容的子类)派生;并用ui生成的类定义一个类里的成员变量(后文成文myui)。这样在MyForm的构造函数中可以直接调用myui和myui中的变量和函数,使用起来很方便。 举例说明, 比如这里有一个ui文件叫myform.uiui文件里定义的窗体名字为BigWidget,上面摆放了一个单行编辑控件叫lineeditName: //myform.h #include “ui_myform.h” class MyForm: public QWidget { Q_OBJECT public: MyForm(QWidget*parent) { myui.setupUi(this); } private: Ui::BigWidget myui; private: void my_function(); }; 上面这段简单的类的声明是前文所述前三点要点的最佳例证,请对照要点的文字描述和具体的代码体会其中的含义。这里还有一点比较有意思的地方,就是ui文件提供的类被包含在了名为Ui的name space里,这样做的目的是将ui文件的命名空间与用户的代码分离,避免两者出现命名冲突的情况。相应的,我们写代码的时候也要注意在使用ui文件中的类时要用“Ui::”的方式进行引用。 再来看cpp文件 //myform.cpp #include #include “myform.h” void my_function(void) { QMessageBox::information(this, “Name”, myui.lineeditName->text()); } 这里随便写了一个函数,为了说明如何在窗体类里调用ui文件中定义的控件。这段代码非常简单,就不多作说明了。 有了单继承的基础,学习多继承是小菜一碟。来段代码看一下就明白了。 //myform.h #include “ui_myform.h” class MyForm: public QWidget, public Ui::BigWidget { Q_OBJECT public: MyForm(QWidget*parent) { setupUi(this); } private: void my_function(); }; //myform.cpp #include #include “myform.h” void my_function(void) { QMessageBox::information(this, “Name”, lineeditName->text()); } 是不是不用说明大家也能明白呢?多继承其实就是不仅从form需要的窗体类去派生,还要加上ui提供的类本身。这样带来的好处是你的窗体类继承了ui里的所有控件和方法,调用时就可以少写一些字。 单继承和多继承这两种方法没有好坏之分,大家可以根据自己的编程习惯取舍。 第四步,编译、验证在pro文件包含正确FORMS信息的情况下,运行qmake; make就可以编译工程了。 make时如果你认真看一下输出就会发现,make在最开始编译的时候就会自动调用uic去生成需要的代码。经过make之后ui_myform.h文件就生成了,建议大家去看一下这个文件的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值