Qt5学习笔记3:Qt的ui界面文件与程序源代码的生成关系及访问

2023-11-02

首先,按照前面章节的方法,创建一个工程demo,位于目录demo/下,然后直接编译运行。弹出一个空窗口,如下:

工程项目在Qt creator的管理界面显示如下:

在工程目录demo/下,生成了两个文件夹:build-xxx-Debug和demo,

所含文件分别如下:

Qt creator中的项目界面显示的文件与这两个文件夹分别是什么关系?demo里面的就是Qt creator中显示的文件,是重要的源码文件,而build-xxx-Debug似乎并不重要,只是编译生成的一些目标文件。确实也如此,把build-xxx-Debug文件夹删掉,重新编译工程,还能重新生成。

 

一、文件夹build-xxx-Debug与demo之间的关系

从上面的实验来看,build-xxx-Debug只是临时生成的,无关重要,而demo里面的才是真正有用的文件。

首先从xxx.ui文件入手,这是个界面文件,添加控件:一个“Hello world”的标签label

然后,编译,运行,结果:如你所想

查看代码添加了什么内容。。。没变化???!!!

按理来说,我把一个控件拉进界面里面,重新编译出来的源码会添加相应的代码,但是,事实并没有并没有。

mainwindow.cpp代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"

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

MainWindow::~MainWindow()
{
    delete ui;
}

确实没有"Hello world"的label相关代码,但是发现包含的一个头文件“ui_mainwindow.h”,这个文件不在Qt creator的项目界面上,也不在demo目录下,而是在build-xxx-Debug里面。其代码如下:

/********************************************************************************
** Form generated from reading UI file 'mainwindow.ui'
**
** Created by: Qt User Interface Compiler version 5.12.4
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H

#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QLabel>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QStatusBar>
#include <QtWidgets/QToolBar>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE

class Ui_MainWindow
{
public:
    QWidget *centralWidget;
    QLabel *label;
    QMenuBar *menuBar;
    QToolBar *mainToolBar;
    QStatusBar *statusBar;

    void setupUi(QMainWindow *MainWindow)
    {
        if (MainWindow->objectName().isEmpty())
            MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
        MainWindow->resize(400, 300);
        centralWidget = new QWidget(MainWindow);
        centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
        label = new QLabel(centralWidget);
        label->setObjectName(QString::fromUtf8("label"));
        label->setGeometry(QRect(60, 60, 101, 31));
        MainWindow->setCentralWidget(centralWidget);
        menuBar = new QMenuBar(MainWindow);
        menuBar->setObjectName(QString::fromUtf8("menuBar"));
        menuBar->setGeometry(QRect(0, 0, 400, 28));
        MainWindow->setMenuBar(menuBar);
        mainToolBar = new QToolBar(MainWindow);
        mainToolBar->setObjectName(QString::fromUtf8("mainToolBar"));
        MainWindow->addToolBar(Qt::TopToolBarArea, mainToolBar);
        statusBar = new QStatusBar(MainWindow);
        statusBar->setObjectName(QString::fromUtf8("statusBar"));
        MainWindow->setStatusBar(statusBar);

        retranslateUi(MainWindow);

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

    void retranslateUi(QMainWindow *MainWindow)
    {
        MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", nullptr));
        label->setText(QApplication::translate("MainWindow", "Hello world", nullptr));
    } // retranslateUi

};

namespace Ui {
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MAINWINDOW_H

竟然惊奇地发现,有我们之前添加的label,而且setText设置文本为"Hello world"!

看来,就是它了!不信?可以再拉些控件进来重新编译生成,再看这个文件是否有产生相关代码。

 

二、操作xxx.ui界面文件如何转换成相应程序代码?

其实,xxx.ui文件是一个XML文件,在Qt creator双击打开就是显示窗口界面,以文本方式打开:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <widget class="QLabel" name="label">
    <property name="geometry">
     <rect>
      <x>60</x>
      <y>60</y>
      <width>101</width>
      <height>31</height>
     </rect>
    </property>
    <property name="text">
     <string>Hello world</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>400</width>
     <height>28</height>
    </rect>
   </property>
  </widget>
  <widget class="QToolBar" name="mainToolBar">
   <attribute name="toolBarArea">
    <enum>TopToolBarArea</enum>
   </attribute>
   <attribute name="toolBarBreak">
    <bool>false</bool>
   </attribute>
  </widget>
  <widget class="QStatusBar" name="statusBar"/>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>

可看出,全是XML语言描述的,其作用就是通过XML语言定义了窗口上的所有组件的属性设置、布局,及其信号与槽函数的关联等。当我们在界面上添加/删除控件时,其界面会被解析为相应的XML代码,所以其代码与界面是相互转换、等价的。

其实,Qt是通过一个名为“uic”的工具,将ui文件生成.h文件的(有兴趣的可以自行用命令执行)。

当我们在界面上操作控件时,查看xxx.ui文件会产生相应的代码,如我们添加的label,也出现在上面。

可通过比对“在界面上操作控件”前后代码的变化来一探究竟。

 

三、通过代码来访问ui界面文件中的控件

1、在ui界面中设置组件属性

我们可以在ui界面右下角的组件属性窗口设置组件的属性,属于图形界面设计方式,如下:

如设置label字体大小和内容在QWidget的“font”和QLabel的“text”里(如图),具体每项属性就不详细列出了。

 

2、通过代码来访问并操作组件

首先,想要代码访问,必须先知道它的标签是什么,也就是变量名是什么?

在ui界面右下角的组件属性的QObject中objectName就是了,如label的如下图,且支持修改。

同理,往界面上拖入一个按键Push Button组件,可在objectName将其修改(如改为“myButton”)。

现在回到代码中,在mainwindow.cpp中的构造函数访问label组件和button组件,设置其text内容、大小等。

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    /* 设置label属性 */
    ui->label->setText("Welcome Zengzr");
    ui->label->resize(300,60);

    /* 设置PushButton属性 */
    ui->myButton->setText("My Button");
}

MainWindow::~MainWindow()
{
    delete ui;
}

编译运行,如下图:

如上,通过ui->label和ui->myButton访问,label和myButton均是objctName项的名称。

添加其他组件亦是如此道理。

 

以上举例较简单,意在梳理清楚ui界面及代码之间的联系。

 

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

Qt5学习笔记3:Qt的ui界面文件与程序源代码的生成关系及访问 的相关文章

  • Qt 是否已经有了自己的 new 和 delete 运算符?

    我正在使用一个QGraphicsScene小部件并在其上显示一些点QGraphicsRectItem 这意味着要拨打很多电话new addItem 当出现时 并且removeItem delete摆脱未使用的点 当然 对于性能问题 我已经实
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • 如何向同一个 QMenu 添加多个 QAction?

    我正在尝试实现 Qt 菜单自定义 并且我提供了一个功能来添加相同的功能QAction在同一个人民币上下文菜单中多次 但是当我尝试这样做时 myMenu gt addAction myAction myMenu gt addAction my
  • Mac 上的 Qt — 如何访问帮助菜单中的“搜索”

    我正在将我的 Qt 应用程序移植到 Mac OS X 在 Windows Linux 上 我使用 QLineEdit 在帮助菜单中提供搜索功能 In Mac OS X I saw something like this is built i
  • 静态变量中的 qt tr()

    我在 qt 中的翻译方面遇到问题 我的项目中的所有翻译都工作正常 但有一个翻译位于类的静态变量中 相应部分代码如下 头文件类似于这样 typedef struct int type QString problematicString inf
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • 如何访问Loader的sourceComponent中的QML对象?

    我可能需要读取或写入的一些属性Loader s sourceComponent来自一些外部函数 访问该房产的方式是什么x里面的对象的Loader s sourceComponent import QtQuick 2 0 Item width
  • Qt中正确的线程方式

    我的图像加载非常耗时 图像很大 并且在加载时也完成了一些操作 我不想阻止应用程序 GUI 我的想法是在另一个线程中加载图像 发出图像已加载的信号 然后用该图像重绘视图 我的做法 void Window loadImage ImageLoad
  • 使用 Qt 的网络服务

    我正在寻找使用 Qt 服务器端 实现 Web 服务的代码 如果您有任何信息 我将不胜感激 Regards 您可以使用libqxt http libqxt bitbucket org doc 0 6 qxtweb html实现服务器端Web服
  • 常量类成员、赋值运算符和 QList

    请确认我是否正确并告诉我是否有更好的解决方案 我了解具有常量成员的对象 例如int const width 无法由编译器隐式创建的合成赋值运算符处理 但是 QList 我想 std list 也是如此 需要一个有效的赋值运算符 因此 当我想
  • QObject多重继承

    我正在尝试在 C Qt 类中使用 mix 来提供一大堆具有通用接口的小部件 该接口是以这样的方式定义的 如果它被定义为其他小部件类的基类 那么小部件本身将具有这些信号 class SignalInterface public QObject
  • QPainterPath::arcTo 上的角度如何解释?

    我正在开发图形编辑器的功能 在其中编辑弧线 当形状是椭圆形时 QPainterPath arcTo 的行为并不像我预期的那样 当它是一个圆圈时 它会按预期工作 下面的两张图片显示了结果 在第一种情况下 我创建了一个圆 然后将其转换为初始起始
  • 从 Qt 更改屏幕分辨率?

    我想更改屏幕分辨率 然后使用一个 ActiveX 控件 Flash 播放器 进入全屏 显然 仅适用于 Windows 的解决方案就可以了 有 Qt api 吗 还是我需要深入研究 winapi 如果是这样 我该在哪里查找 关键字 谢谢您的帮
  • QT C++ QRegularExpression 多个匹配

    我想使用正则表达式从 QString html 中提取信息 我明确想使用正则表达式 无解析器解决方案 和类Q正则表达式 http qt project org doc qt 5 0 qtcore qregularexpression htm
  • 在 Windows 上以 QML 播放 RTSP 视频

    我正在尝试将 QML 中的 RTSP 流播放到视频标签中 如下所示 Repeater model 8 Video Layout fillWidth true Layout fillHeight true fillMode VideoOutp
  • 为什么anchors.centerIn不适用于Column元素?

    我有这段 QML 代码 Column spacing units gu 2 anchors fill parent centerIn parent Row spacing units gu 4 Row spacing units gu 4
  • MapItemView 在 dataChanged 信号后不会更新

    我正在使用 QMLMapItemView使用 C 的组件QAbstractListModel基于模型 这MapItemView当模型重置时 或者每当添加新项目或删除现有项目时 工作正常 但是 那MapItemView不反映对已添加项目的更改
  • qvariant 作为 qhash 中的键

    我想创建一个带有 QVariants 键的数据结构 它看起来像这样 QHash
  • Qt - QProcess 不工作

    我尝试启动 Internet Explorer 所以我使用下面的代码 QProcess process new QProcess this QString temp C Program Files Internet Explorer iex
  • 我如何告诉 QTableWidget 结束编辑单元格?

    我正在显示一个弹出菜单来选择 QTableWidget 中的某些值 最下面的项目是 修改列表 条目 当我选择它时 应自动出现一个新窗口 并且 QComboBox 应消失 并且单元格返回到 Qt DisplayRole 状态 现在 Qt 拥有

随机推荐

  • windows10+python3.6+anaconda+pytorch-cpu的初步环境搭建

    windows10 python3 6 anaconda pytorch cpu的初步环境搭建 安装pytorch cpu 新建环境 1 利用anaconda进行创建新的环境 cmd conda create n pytorch pytho
  • 2018年LeetCode高频算法面试题刷题笔记——分割回文串(字符串)

    1 解答之前的碎碎念 这个题我的想法是 第一刀依次切在第1 s length 2个元素后面 得到两个字符串s0和s1 首先判断s0整体是否为回文 不是则第一刀的位置 1 然后再检测s1整体是否为回文 并在s1的第1 s1 length 2个
  • C++关于(*i)->n为何要加括号

    include
  • Linux基础命令--文件和目录管理命令

    目录 常用文件和目录管理命令 1 ls命令 ls命令还支持一些选项和参数 例如 2 ll命令 基本用法如下 3 cd命令 除了基础用法外 cd命令还有一些常用的选项 如 4 pwd命令 基础用法如下 5 mkdir命令 基础用法如下 6 r
  • Dilated Convolution介绍

    Dilated Convolution介绍 相关的两篇论文分别是 ICLR2016 MULTI SCALE CONTEXT AGGREGATION BY DILATED CONVOLUTIONS 和 CVPR2017 Dilated Res
  • vcruntime140.dll重新安装方法,vcruntime140.dll修复教程

    vcruntime140 dll是Microsoft Visual C Redistributable的一部分 它是Windows操作系统上非常重要的一个动态链接库文件 这个文件包含了一些运行时库函数 用于支持运行在Windows上使用了M
  • C# RestSharp,Body提交

    关于RestSharp Body提交 需要引用RestSharp 遇到一个问题 使用Httprequest提交Post请求时 各种值传不过去 使用Postman用同样的 添加请求头 传输json格式亦然 经过大佬指点 用Postman里面的
  • MATLAB删除任意字符

    删除空格 s isspace s 去除空格 删除字符串中所有的16进制的0 char2asc2 abs s 转asc2 char2asc2 char2asc2 0 删除NULL 0 s char char2asc2 删除字符串中所有的16进
  • 在Windows下使用Curl工具完美操作ElasticSearch

    首先可以从 http curl haxx se download html上下载并安装Windows环境下的Curl 安装完成后 将Curl的I386目录的完整路径添加到Windows的Path环境变量中 C Users Carl gt c
  • 专利与论文-1:为什么要写专利?专利有什么好处?

    前言 很多人 都认为写专利没什么多大的用处 不过是个人赚一点公司申请专利的奖励而已 对个人和公司 用处都不是大 还不如做学习一些专业技能或做一些实际项目 花在专利上的实际不太值得 随着时间和知识双重积累 越来越会发现专利 无论对于个人还公司
  • 强化学习代码实战入门

    这是一个易理解的 demo 300行左右 可以作为RL的入门代码 辅助基础公式的理解 这个是我自己的学习笔记 三连留下邮箱 可以直接发送完整的代码标注文件 如有错误 麻烦指出 我已经蛮久没写博了 上一篇RL博客也快一年半了 很久没做这一块了
  • Java生成二维码并解决中文乱码问题

    Java生成二维码并解决中文乱码问题 引入依赖 JAVA代码 引入依赖 maven工程
  • ESP32+st7789/ili9341运行LVGL例程,依赖ESP-IDF编译lv_port_esp32官方Demo(1)

    LVGL是一个C语言编写的免费的开源图形库 其提供了用于嵌入式GUI的各种元素 用户可以利用丰富的图形库资源 在消耗极低内存的情况下构建视觉效果丰富多彩的GUI 只需 64kB 闪存和 8kB RAM 就足以满足简单的用户界面 LVGL 可
  • 【ObjectARX】--创建和访问图形数据库(DwgDatabase)

    1 使用ObjectARX创建新工程DwgDatabase 选择MFC支持 2 注册一个命令CreateDwg创建一个新的图形文件 并保存在AutoCAD的安装路径中 实现函数为 static void AAAMyGroupCreateDw
  • Java链式编程与Builder(建造者)设计模式

    一 链式编程 1 1 释义 链式编程 也叫级联式编程 调用对象的函数时返回一个this对象指向对象本身 达到链式效果 可以级联调用 1 2 特点 可以通过一个方法调用多个方法 将多个方法调用链接起来 形成一条 链式 从而提高代码的可读性 1
  • ASP.NET Web Pages基础知识---Razor 实例:显示图片

    假设在您的图像文件夹中有 3 张图像 您想根据用户的选择动态地显示图像 这可以通过一段简单的 Razor 代码来实现 如果在您的网站的图像文件夹中有一个名为 Photo1 jpg 的图像 您可以使用 HTML 的 img 元素来显示图像 如
  • 用于机器学习的 NumPy(ML)

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 031.PyQt5_QCommandLinkButton_命令链接按钮

    QCommandLinkButton命令链接按钮 描述 命令链接是Windows Vista引入的新控件 它的用途类似于单选按钮的用途 因为它用于在一组互斥选项之间进行选择 命令链接按钮不应单独使用 而应作为向导和对话框中单选按钮的替代选项
  • 【pytorch】微调技术

    前言 训练神经网络是一件非常耗费时间的事情 其需要大量的算力以及大量的数据 显然从头开始训练并不是明智之选 利用好已有的资源才是明智之选 微调技术 图像识别笼统地可以分为两步 提取图片的特征 此部分往往通过CNN卷积神经网络实现 根据提取的
  • Qt5学习笔记3:Qt的ui界面文件与程序源代码的生成关系及访问

    首先 按照前面章节的方法 创建一个工程demo 位于目录demo 下 然后直接编译运行 弹出一个空窗口 如下 工程项目在Qt creator的管理界面显示如下 在工程目录demo 下 生成了两个文件夹 build xxx Debug和dem