这两天跟着班级辅导,总有学生感到很疑惑,用ui designer设计出来的ui文件是如何使用的,下面我从一个例子来说明下,希望能对有这样疑惑的同学有帮助。

事实上,现在有了继承设计工具qtcreator,作为开发者再也不用考虑这个问题,因为当你用qtcreator创建一个工程的时候,qtcreator提供的框架已经替我们完成了这个任务。

咱们先从这个程序开始看:

新建一个工程,

在这个工程中用ui designer来设计了这样的一个界面

这是我按ctrl+alt+r运行出来的,如何使这个利用ui designer设计出来的ui文件能运行起来就是我们这篇文章要议论的内容。

先来看看qtcreator提供的默认框架是如何实现的。要研究qtcreator怎么实现,就得先看dialog.h这个文件。

#ifndef DIALOG_H
        #define DIALOG_H

#include <QDialog>

namespace Ui {
                class Dialog;
        }

class Dialog : public QDialog {
                Q_OBJECT
        public:
                Dialog(QWidget *parent = 0);
                ~Dialog();

protected:
                void changeEvent(QEvent *e);

private:
                Ui::Dialog *ui;

private slots:
                void on_pushButton_clicked();
        };

#endif // DIALOG_H

观察不难得出,在上文中我用红色包含的就是实现这个程序的关键。它声明一个类,将设计出来的ui界面作为该类的一个子对象,在其构造函数中,先完成对子对象的构造,再使用子对象ui调用其setupUi(this)函数实现ui的现实。

Dialog::Dialog(QWidget *parent) :
                QDialog(parent),
                ui(new Ui::Dialog)
        {
                ui->setupUi(this);
        }

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

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

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

uic dialog.ui –o tt.h

就生产了下面的文件:

/********************************************************************************
        ** Form generated from reading UI file 'dialog.ui'
        **
        ** Created: Sun May 9 17:29:42 2010
        **        by: Qt User Interface Compiler version 4.6.2
        **
        ** WARNING! All changes made in this file will be lost when recompiling UI file!
        ********************************************************************************/

#ifndef TT_H
        #define TT_H

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

QT_BEGIN_NAMESPACE

class Ui_Dialog
        {
        public:
                QLabel *label;
                QPushButton *pushButton;

void setupUi(QDialog *Dialog)
                {
                        if (Dialog->objectName().isEmpty())
                        Dialog->setObjectName(QString::fromUtf8("Dialog"));
                        Dialog->resize(115, 148);
                        label = new QLabel(Dialog);
                        label->setObjectName(QString::fromUtf8("label"));
                        label->setGeometry(QRect(10, 30, 91, 21));
                        QFont font;
                        font.setPointSize(12);
                        font.setBold(true);
                        font.setWeight(75);
                        label->setFont(font);
                        pushButton = new QPushButton(Dialog);
                        pushButton->setObjectName(QString::fromUtf8("pushButton"));
                        pushButton->setGeometry(QRect(20, 80, 75, 23));

retranslateUi(Dialog);

QMetaObject::connectSlotsByName(Dialog);
                } // setupUi

void retranslateUi(QDialog *Dialog)
                {
                        Dialog->setWindowTitle(QApplication::translate("Dialog",        "Dialog",        0,        QApplication::UnicodeUTF8));
                        label->setText(QApplication::translate("Dialog",        "hello,wang",        0,        QApplication::UnicodeUTF8));
                        pushButton->setText(QApplication::translate("Dialog",        "close",        0,        QApplication::UnicodeUTF8));
                } // retranslateUi

};

namespace Ui {
                class Dialog: public Ui_Dialog {};
        } // namespace Ui

QT_END_NAMESPACE

#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函数。

#include <QtGui/QApplication>
        #include <QDialog>

#include "ui_dialog.h"
        int main(int argc, char *argv[])
        {
        QApplication a(argc, argv);
        Ui::Dialog ui;
        QDialog *d=new QDialog;
        ui. setupUi(d);
                d->show();
                return a.exec();
        }

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

#include <QDialog>
        #include "ui_dialog.h"

class Dialog : public QDialog {
                Q_OBJECT
        public:
                Dialog(QWidget *parent = 0);
                ~Dialog();

protected:
                void changeEvent(QEvent *e);

private:
                Ui::Dialog *ui;

private slots:
                void on_pushButton_clicked();
        };

这样使用的时候需要注意的是在初始化的时候要先完成子对象的初始化,在其构造函数中重写构造函数。

Dialog::Dialog(QWidget *parent) :
                QDialog(parent),
                ui(new Ui::Dialog)
        {
                ui->setupUi(this);
        }

第三种方法是以Ui_Dialog类为基类,派生一个新类,在该类的初始化函数中调用setupUi。

#ifndef DIALOG_H
        #define DIALOG_H

#include <QDialog>
        #include "ui_dialog.h"

class Dialog : public QDialog ,public Ui::Dialog
        {
                Q_OBJECT
        public:
                Dialog(QWidget *parent = 0);
        };

实现如下:

#endif // DIALOG_H
        #include "dialog.h"
        #include "ui_dialog.h"

Dialog::Dialog(QWidget *parent) :
                QDialog(parent),
                Ui::Dialog()
        {
                setupUi(this);
        }

希望通过讲解,大家能总结出该如何使用ui文件。无非就是利用默认工具uic自动产生的类,去调用该类的setui函数。第一种是直接使用,第二种是定义一个新类,声明一个ui子对象,第三种是将ui作为基类派生新的类。

http://blog.csdn.net/zyx_linux/article/details/23370043

Qt编程中,Ui文件如何被利用的更多相关文章

  1. [转]Qt中ui文件的使用

    用designer设计的*.ui文件可以通过uic工具转换为*.h文件(在编译时也会自动生成这样一个ui_*.h文件),有了这个.h文件就可以直接按照纯C++的方式对其中的类进行调用.ui文件的使用就 ...

  2. Visual Studio下Qt编程中对中文的处理

    Visual Studio下Qt编程中对中文的处理 本文为原创文章,原文地址http://www.cnblogs.com/c4isr/p/qt_develop_in_vs.html Visual St ...

  3. Qt Designer设计 UI 文件并调用

    本文介绍的是Qt Designer设计 UI 文件并调用,在坛子里逛了一圈,关于UI方面的好像不怎多,本篇给大家分享一下. AD: 2013云计算架构师峰会超低价抢票中 Qt Designer设计 U ...

  4. 在windows下的QT编程中的_TCHAR与QString之间的转换

    由于在windows下的QT编程中,如果涉及到使用微软的API,那么不可避免使用_TCHAR这些类型,因此在网上查了一下,其中一个老外的论坛有人给出了这个转换,因此在这里做一下笔记 : )#ifdef ...

  5. qt creator 使用Ui文件的问题

    一.显式地调用uic.exe 如何将UI文件生成头文件 1,将设计的UI文件拷贝到uic.exe的目录下Qt\Qt5.3.2\5.3\mingw482_32\bin. 2, 打开windows的CMD ...

  6. Qt 手动添加ui文件到工程(转)

    制作ui文件 先应该用Qt Designer绘制一个自己的界面,并存为myform.ui(这里的myform可以用自己喜欢的名字代替).在制作自己的界面文件时要注意以下几个要点: 1.要记住ui文件的 ...

  7. Qt探秘——谈ui文件的用法

    转载自:点击打开链接http://blog.csdn.net/luo_isaiah/article/details/5794973 相信用过Qt Designer的朋友,对Qt Project中的.u ...

  8. eric6中ui文件编译失败,提示找不到puicc5

    1解决办法 在setting中——preference 找到qt设置——pyQT工具文件选择更改为: 我的pyuicc5.exe文件在这个目录下 然后右击编译窗口,就成功了. 如果找不到ui文件,在窗 ...

  9. QT笔记 -- (1) .ui文件

    刚开始写QT,designer用的不习惯,打开.ui文件看了一下,很容易读的xml文件,记录一下. 大体框架如下 <?xml version="1.0" encoding=& ...

随机推荐

  1. Android杂谈--ListView之BaseAdapter的使用

    话说开发用了各种Adapter之后感觉用的最舒服的还是BaseAdapter,尽管使用起来比其他适配器有些麻烦,但是使用它却能实现很多自己喜欢的列表布局,比如ListView.GridView.Gal ...

  2. PKU POJ 1006 Biorhythms (中国剩余定理)

    中国剩余定理 x = ai (mod mi)  ai和mi是一组数,mi两两互质,求x 令Mi = m1*m2*~mk     其中,mi不包含在内. 因为mi两两互质,所以存在x和y, st   M ...

  3. Problem B The Blocks Problem(vector的使用)

    题目链接:Problem B 题意:有n块木块,编号为0~n-1,要求模拟以下4种操作(下面的a和b都是木块编号) 1. move a onto b: 把a和b上方的木块全部归位,然后把a摞在b上面. ...

  4. 基本event封装:阻止冒泡、默认事件等

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> ...

  5. 在Linux中创建静态库和动态库 (转)

    我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为静态库和动态库两种.静态 库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库在程序编译时并不会被连接到目标代码中,而 ...

  6. android-适配Adapter

    Adapter是把数据和用户界面视图绑定到一起的桥梁类,负责创建用来表示父视图中的每一个条目的子视图,并提供对底层数据的访问. public class MainActivity extends Ac ...

  7. C#调用matlab出错r6034错误解决方法[转载]

    在c#调用MATLAB时,在运行第一次会出现r6034错误. 解决方法如下: 1.在MCR安装目录下D:\Program Files\MATLAB\MATLAB Compiler Runtime\v7 ...

  8. 64位linux下安装oracle10 64位 遇到 :ins_ctx.mk ;ins_emdb.mk

    http://blog.csdn.net/bamuta/article/details/10523835 http://www.cnblogs.com/kerrycode/p/3519446.html ...

  9. 射频识别技术漫谈(20)——RC系列射频接口芯片

    目前基于13.56MHz的射频识别技术主要有ISO14443A.ISO14443B.ISO15693和FELICA技术.针对13.56MHz的射频识别技术,NXP开发了一系列名字以RC(Radio C ...

  10. 远程管理服务SSHD

    安装SSH yum install openssh