Qt中ui文件的使用

2023-10-27

      用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******************************************/

/********************************************************************************
** Form generated from reading UI file 'hellodialog.ui'
**
** Created: Wed May 14 19:28:14 2014
**      by: Qt User Interface Compiler version 4.8.4
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#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
/****************************************main.cpp****************************************/

#include "ui_hellodialog.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QDialog w;
    Ui::HelloDialog ui;
    ui.setupUi(&w);
    w.show();
    return a.exec();
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt中ui文件的使用 的相关文章

  • 如何通过 Qt 创建网络服务 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 无法在 QGLWidget 中设置所需的 OpenGL 版本

    我正在尝试在 Qt 4 8 2 中使用 QGLWidget 我注意到 QGLWidget 创建的默认上下文不显示 OpenGL 3 1 以上的任何输出 Qt wiki 有一个教程 http qt project org wiki How t
  • 具有多个父项的 Qt 树模型

    我想构建一棵树 其中一个元素可以引用另一个元素 我想要构建的树是 像这样的东西 A B C D E F P this is a pointer to C D first child of C E second child of C I fo
  • 获取 QPushButton 在 2D 数组 QPushButton 上的索引

    我有一个二维数组QPushButton 当用户单击按钮时如何获取按钮的索引 例如当用户单击按钮时a 2 3 它会显示 2 3 该示例如下所示 Qt 4 5 使用对象名称 您可以为按钮指定唯一的对象名称 理想情况下 名称应该是有效的 C 标识
  • 如何为 qmlRegisterSingletonType 实现单例提供程序?

    我想在 QML 中使用 C 类作为 Singleton 实例 并认为我必须使用 qmlRegisterSingletonType 注册它们 此函数需要一个提供已注册 C 类的实例的函数 我在 Windows 上使用最新的 Qt 5 3 1
  • 无法将 QList 分配给 QString

    我遇到这个错误 Unable to assign QList
  • QComboBox 下拉项边距

    我想设计我的风格QComboBox为下拉项目留出边距 现在是这样的 我想要这样的东西 我尝试过 QComboBox QAbstractItemView item margin 3px 但它不起作用 你能帮我解决这个问题吗 您想在项目之间设置
  • new 运算符(以及 malloc)无法分配约 450 MB 的内存 [重复]

    这个问题在这里已经有答案了 我正在开发一个程序 该程序在内存中存储大约 2 2 亿个短值的数组 该数据块的分配方式如下 short arrayName new short SIZE OF ARRAY 然后将文件的内容读入内存 在团队中的另一
  • QStyledItemDelegate 绘制自定义小部件失败

    在我的一个项目中 我使用的是QTableWidget为了显示一些复杂的计算结果 为了提高表格的可读性 我需要在单个表格单元格内显示两个对齐的值 后来我想通过使用颜色或箭头等来进一步自定义小部件 为此我源自QStyledItemDelegat
  • QT:删除QGridLayout中QLabel之间的空格

    我将一些具有不同颜色的 QLabels 添加到 QGridLayout 作为 QWidget 的布局 现在我在每个 Qlabel 与下一个 Qlabel 之间有一个间距 我想将其删除 我尝试将标签的边距设置为 0 将 GridLayout
  • C++ SQL 查询构建库

    我正在寻找一个提供与 c SelectQueryBuilder 库类似功能的 c 库 http www codeproject com Articles 13419 SelectQueryBuilder Building complex a
  • 如何去除QWizard中的水平线?

    我正在研究一个样式表QWizard我想删除按钮上方的水平线 我尝试递归浏览所有小部件并将其边框设置为无 但似乎没有任何小部件具有此边框 这是我的代码 可以找到完整的可构建示例here https gist github com ardeid
  • QTableView 并双击一个单元格

    我正在开发测试用例编辑器 该编辑器包含 USART 传输和接收数据包格式 编辑器是一个表格视图 发送和接收数据包的长度为八个字节 例如 0x01 0x02 0x03 0x08 它在我的第五和第六栏中 现在 我希望此列中的单元格为只读 但是当
  • Qt:不完整类型和前向声明的使用无效

    我有一些误解 A h ifndef A H define A H include B h class A public B Q OBJECT public A endif A cpp include A h A A B ui gt blan
  • 如何将自定义 Qt 类型与 QML 信号一起使用?

    我在 Qt 5 2 qml 应用程序中创建了一个自定义类型 class Setting public QObject Q OBJECT Q PROPERTY QString key READ key WRITE setKey Q PROPE
  • 连接到 QNetworkReply::error 信号

    我正在使用 Qt5 的新连接语法 QNetworkReply 有一个名为error http qt project org doc qt 5 0 qtnetwork qnetworkreply html error 2还有一个函数叫做err
  • 无法运行 Qt 应用程序:找不到版本“Qt_5”

    我运行 Ubuntu 16 04 LTS 我的问题是我无法运行可以编译的 Qt5 应用程序 这是我尝试运行它时得到的结果 home user Desktop sconfig dist Release GNU Linux SCongif us
  • Qt(在 Windows 上)将权限级别设置为“requireAdministrator”

    我正在使用 Qt Creator 并努力制作 exe文件默认以管理员身份运行 在线阅读所有解决方案我试图将这一行放入我的 pro file QMAKE LFLAGS MANIFESTUAC level requireAdministrato
  • Q风格所有权

    在 Qt 应用程序中使用样式时 我遇到了一个有趣的问题QStyle所有权 QStyle继承自QObject 通常接受QObject parent作为构造函数参数来管理其子级的生命周期 但QStyle的构造函数没有此构造函数参数 第一个问题
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某

随机推荐

  • C语言的四种程序结构

    1 顺序结构 顺序结构的程序设计是最简单的 只要按照解决问题的顺序写出相应的语句就行 它的执行顺序是自上而下 依次执行 例如 a 3 b 5 现交换a b的值 这个问题就好像交换两个杯子水 这当然要用到第三个杯子 假如第三个杯子是c 那么正
  • anaconda python未激活_anaconda无法激活新建环境,提示没有那个文件或目录

    遇到的问题 最新在部署tensorflow 但是由于cpu型号比较老的原因 所以直接pip安装tensorflow会提示core dump 吐核 所以需要使用conda来建立一个新的环境 然后使用conda来安装tf即可解决吐核问题 但是有
  • 高效实现延迟消息功能

    高效实现延迟消息功能 高效延时消息 包含两个重要的数据结构 1 环形队列 例如可以创建一个包含3600个slot的环形队列 本质是个数组 2 任务集合 环上每一个slot是一个Set 同时 启动一个timer 这个timer每隔1s 在上述
  • Unity2D入门(七):物理材质、跳跃、基础UI

    一 物理材质 游戏角色在跳跃过程中如果正面碰撞到地形就会卡在上面 所以需要为其添加一种材质 在Assets窗口中 右键 gt 新建一个物理材质 不用做其他的调整 将其拖拽到Player Inspector窗口中的BoxCollider组件的
  • Python测试框架pytest(17)参数化parametrize

    目录 1 参数 2 装饰测试类 3 多个参数化装饰器 4 参数化 传入字典数据 5 标记参数化 6 解决unicode编码问题 pytest mark parametrize 允许在测试函数或类中定义多组参数和 fixtures 参数化场景
  • Stream流

    Stream流的常见生成方式 Stream流中间操作之filter Stream流的常见中间操作方法 Stream流终结操作之forEach count Stream流的收集操作 Stream流的常见生成方式 Stream流的使用 生成流
  • SpringBoot错误: 找不到或无法加载主类

    1 一般出现这种情况都是配置文件application properties出现的问题 2 可以尝试 maven clean install 以及rebuild project 3 删除项目里 idea文件 重新导入至IDEA编辑器 选择M
  • vs2010中臃肿的ipch和sdf文件

    使用VS2010建立C 解决方案时 会生成SolutionName sdf和一个叫做ipch的文件夹 这两个文件再加上 pch等文件使得工程变得非常的庞大 一个简单的程序都会占用几十M的硬盘容量 可惜毕竟硬盘还没有廉价到免费的地步 那么 该
  • 绘图系统二:多图绘制系统

    文章目录 坐标轴控件 坐标系控件 绘制多组数据 源代码 本文基于 从0开始实现一个三维绘图系统 坐标轴控件 三个坐标轴xyz从外观上看其实毫无区别 这种标签和输入框的组合十分常见 为了便于调用 最好实现一个类 tkinter只要继承Fram
  • MyBatis-Plus中的逻辑删除使用

    系列文章目录 Mybatis Plus SpringBoot结合运用 心态还需努力呀的博客 CSDN博客MyBaits Plus中 TableField和 TableId用法 心态还需努力呀的博客 CSDN博客 MyBatis Plus分页
  • 如何通过C语言自动生成MAC地址

    如何通过C语言自动生成MAC地址 最近在做虚拟机项目时 需要给创建的每一个虚拟机自动生成一个MAC地址 由于MAC地址为48位 而且格式是以 隔开的 所以下面我写了一个c程序 来自动生成MAC地址 MAC c include
  • solidity实现智能合约教程(5)-NFT拍卖合约

    文章目录 1 介绍 2 主要功能 3 代码示例 4 部署测试 猛戳订阅学习专栏 solidity系列合约源码 解析 1 介绍 拍卖作为历史悠久的交易方式 具有规范化 市场化的特点 在经济活动中扮演着重要角色 以其公开 公平 公正的价格发现功
  • unity动态加载(1)Resources加载方法

    在开发过程中我们很可能需要使用到动态加载 这样一方面可以节省性能 另一方面使我们的开发过程更加便捷 我之前写过一篇游戏中音效控制器 可以很方便的播放音效 就是用Resources 传送门 大家如果有兴趣可以参考 然后这篇博客实现以下使用Re
  • [推荐] (SqlServer)批量清理指定数据库中所有数据

    在实际应用中 当我们准备把一个项目移交至客户手中使用时 我们需要把库中所有表先前的测试数据清空 以给客户一个干净的数据库 如果涉及的表很多 要一一的清空 不仅花费时间 还容易出错以及漏删 在这儿我提供了一个方法 可快捷有效的清空指定数据库所
  • 杭电1005.找规律就好

    本题连接 点击打开链接 Number Sequence Time Limit 2000 1000 MS Java Others Memory Limit 65536 32768 K Java Others Total Submission
  • 【人工智能】Fisher 线性分类器的设计与实现(QDU)

    人工智能 Astar算法求解8数码问题 QDU 人工智能 利用 搜索的博弈树算法编写一字棋游戏 QDU 人工智能 Fisher 线性分类器的设计与实现 QDU 人工智能 感知器算法的设计实现 QDU 人工智能 SVM 分类器的设计与应用 Q
  • Invalid option 'latest' for /langversion; must be ISO-1, ISO-2, Default or an integer in range 1 to

    Easily Add PDF Word Excel Function to Your NET Apps You may be thinking that C 7 features are already supported with Vis
  • 【C语言】浮点型数据为什么不能直接比较

    由于浮点型的精度是有限的 经过运算就可能存在舍入误差 比如 x y y x 所以如果要比较浮点型数值 最好要先定义一个极小值MIN作为允许误差 1 浮点型与0比较 define MIN 0 0000000001 double temp if
  • 1个星期,教你快速上手Unity ASE-【UI流动】

    目录 前言回顾 效果图 节点预览 步骤 前言回顾 不熟悉节点属性的可以点击传送门预览 传送门 1个星期 教你快速上手Unity ASE 预览 传送门 1个星期 教你快速上手Unity ASE 遮罩 传送门 1个星期 教你快速上手Unity
  • Qt中ui文件的使用

    用designer设计的 ui文件可以通过uic工具转换为 h文件 在编译时也会自动生成这样一个ui h文件 有了这个 h文件就可以直接按照纯C 的方式对其中的类进行调用 ui文件的使用就是利用默认工具uic自动产生一个类 然后用该类的se