Qt(73)

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

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

借用一个例程分析如下:

工程及界面

                                                        

/***************************************dialog.h********************************************/

#ifndef DIALOG_H
        #define DIALOG_H

#include <QDialog>

namespace Ui {
                class Dialog;

}

/*为什么要使用这样一个命名空间呢?因为我们接着又要定义一个Dialog类,二者同名,所以才用了这个命名空间。此处的类Dialog继承自Ui_Dialog,属于一个前置声明,因为在dialog.h中我们有这么一句Ui::Dialog *ui; 使用了Ui::Dialog 来定义一个指针,但是这个Ui::Dialog并没有实际上进行定义(我们是在下文中的ui_dialog.h中定义的Dialog),也没有包含相关头文件,所以用了一个前置声明(关于前置声明此处略)*/

class Dialog : public QDialog {        //又定义了一个Dialog类
                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  ui_dialog.h

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

/**************************************ui_dialog.h*******************************************/

#ifndef UI_DIALOG_H
        #define UI_DIALOG_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 {};    //此处定义了命名空间,其中定义了一个Dialog类,继承自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提供的那种方法。(也叫单继承方法,只继承了QDialog类)

#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。(也叫多重继承方法,继承了QDialog类和Ui::Dialog类)

#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_hellodialog.h的小例程

           

程序如下:

/**************************************ui_hellodialog.h******************************************/

[cpp] view plaincopy
  1. /********************************************************************************
  2. ** Form generated from reading UI file 'hellodialog.ui'
  3. **
  4. ** Created: Wed May 14 19:28:14 2014
  5. **      by: Qt User Interface Compiler version 4.8.4
  6. **
  7. ** WARNING! All changes made in this file will be lost when recompiling UI file!
  8. ********************************************************************************/
  9. #ifndef UI_HELLODIALOG_H
  10. #define UI_HELLODIALOG_H
  11. #include <QtCore/QVariant>
  12. #include <QtGui/QAction>
  13. #include <QtGui/QApplication>
  14. #include <QtGui/QButtonGroup>
  15. #include <QtGui/QDialog>
  16. #include <QtGui/QHeaderView>
  17. #include <QtGui/QLabel>
  18. QT_BEGIN_NAMESPACE
  19. class Ui_HelloDialog
  20. {
  21. public:
  22. QLabel *label;
  23. void setupUi(QDialog *HelloDialog)
  24. {
  25. if (HelloDialog->objectName().isEmpty())
  26. HelloDialog->setObjectName(QString::fromUtf8("HelloDialog"));
  27. HelloDialog->resize(400, 300);
  28. label = new QLabel(HelloDialog);
  29. label->setObjectName(QString::fromUtf8("label"));
  30. label->setGeometry(QRect(120, 120, 151, 31));
  31. retranslateUi(HelloDialog);
  32. QMetaObject::connectSlotsByName(HelloDialog);
  33. } // setupUi
  34. void retranslateUi(QDialog *HelloDialog)
  35. {
  36. HelloDialog->setWindowTitle(QApplication::translate("HelloDialog", "Dialog", 0, QApplication::UnicodeUTF8));
  37. label->setText(QApplication::translate("HelloDialog", "Hello World! \344\275\240\345\245\275Qt\357\274\201", 0, QApplication::UnicodeUTF8));
  38. } // retranslateUi
  39. };
  40. namespace Ui {
  41. class HelloDialog: public Ui_HelloDialog {};
  42. } // namespace Ui
  43. QT_END_NAMESPACE
  44. #endif // UI_HELLODIALOG_H

/****************************************main.cpp****************************************/

[cpp] view plaincopy
  1. #include "ui_hellodialog.h"
  2. int main(int argc, char *argv[])
  3. {
  4. QApplication a(argc, argv);
  5. QDialog w;
  6. Ui::HelloDialog ui;
  7. ui.setupUi(&w);
  8. w.show();
  9. return a.exec();
  10. }

Qt中ui文件的使用相关推荐

  1. 【Qt】Visual Studio中无法打开Qt中UI文件

    00. 目录 文章目录 00. 目录 01. 问题描述 02. 开发环境 03. 问题分析 04. 问题解决 05. 预留 01. 问题描述 使用Visual Studio打开纯Qt项目之后, 点击Q ...

  2. QT中ui文件生成关联的C++类

    在VS2008中给对话框资源添加关联的C++类时,可通过右键菜单"添加类"直接添加关联的C++类,但QT中不支持这样的操作.在QT中在创建界面ui时,可手动也可自动创建ui文件关联 ...

  3. Qt项目UI文件中新添加的控件在代码中不识别的问题

    ui->XXXX 在UI界面中新添加了控件,但是在代码中怎么也不出现,或者划红线 我看不少人说备份删除文件再添加,或者关闭QT再打开... 其实只要右键项目清除构建,然后重新构建就可以了, 这有 ...

  4. Qt中Ui名字空间以及setupUi函数的原理和实现

    Qt中Ui名字空间以及setupUi函数的原理和实现 分类: Qt GUI 2012-03-08 15:38 10514人阅读 评论(4) 收藏 举报 uiqtsignalclassdelete 用最 ...

  5. qt中.pro文件详细说明

    工程上需要使用QT框架进行项目开发,.pro文件里面的具体配置方式比较模糊.详细整理文件里各配置项的含义,并对其编写方法进行归纳总结. 目录 1.配置项说明 1.1.注释 # 1.2.添加/排除QT项 ...

  6. QT中TCP文件传输

    QT中TCP文件传输 一.UI文件 1.serverwidget.ui 2.clientwidget.ui 二..h文件 1.serverwidget.h 2.clientwidget.h 三.cpp ...

  7. Qt 中pro文件换行注意的问题

    Qt 中pro文件换行必须用  \,直接按回车换行会导致程序不正确.如下: CONFIG(debug, debug|release) {OBJECTS_DIR += $$PWD/../debugDES ...

  8. Qt中pro文件如何从相对路径导入库

    Qt中pro文件如何从相对路径导入库 Qt工程中有lib.dll.a.so等文件需要导入时,有时需要指定路径.指定绝对路径换到其他机器编译时会不大方便.那么,如何在Qt pro文件中通过相对路径导入库 ...

  9. QT中ui更改后不能更新的解决方法

    QT中ui更改后不能更新的解决方法 参考文章: (1)QT中ui更改后不能更新的解决方法 (2)https://www.cnblogs.com/qiaozhoulin/p/4509939.html 备 ...

最新文章

  1. android调用相册和摄像头,调用Android摄像头与打开相册
  2. 节省磁盘空间的新一代包管理工具PNPM
  3. C++中多态与虚函数的学习例子
  4. 1027. 打印沙漏(20)
  5. 算法学习——决策单调性优化DP
  6. 北京电子科技学院计算机怎么样,北京电子科技学院计算机技术怎么样
  7. 【面向对象】第三单元总结——JML
  8. 晶闸管的原理及伏安特性
  9. 服务器slot槽位位置,华为OSN2500子架及其槽位的分配
  10. 管理信息系统——决策表例题
  11. 遗传算法求解函数最大值的python实现
  12. MATLAB寻找水仙花数字
  13. Vue Devtools下载使用
  14. 视频消重软件百度云 小视频修改md5
  15. 服装行业要渡“疫情劫”,赢家时尚凭什么成为增长样本?
  16. 安徽科技学院2017-2018-1学期15电信12班《Java编程技术》课下作业~解题报告
  17. 2020年王鼎杯反序列化题目复现
  18. 鸿蒙手机摄影,鸿蒙系统正式亮相 华为:手机随时可以使用
  19. 关于《管理:技艺之精髓》一书中提到的管理任务和工具
  20. 图片为什么要转化为base64格式

热门文章

  1. 2021 4 21 管理心得
  2. 在github上面下载文件夹的方法666
  3. Java springcloud B2B2C o2o多用户商城 springcloud架构 (二十二)创建含有多module的springboot工程...
  4. 谈论linux同组多用户操作问题
  5. Q1全球智能机销量增长3.9% 三星苹果华为居三甲
  6. ICallbackEventHandler使用
  7. Flot使用文档(转)
  8. 关于Java性能监控您不知道的5件事
  9. qsort(),sort()排序函数
  10. nyoj 12(区间覆盖)