[编程语言][C++][Qt]单独添加UI文件
创始人
2024-04-30 19:09:07
0

单独添加UI文件

  • 问题描述
  • 解决方案
    • 1. 添加UI文件
    • 2. 与对应的界面类进行关联
    • 3. 修改UI文件
    • 4. 设置界面类读取UI文件
  • 总结

问题描述

不知什么原因,Qt Creator并不是很完美很智能。当先写好界面类的头文件和源代码文件后,我们再添加用于可视化界面设计的UI文件时,会出现一些问题。

解决方案

1. 添加UI文件

选择添加文件的类型
选择界面类型
设置UI文件的文件名
选择所属项目
手动将UI文件包含进项目
当使用CMake管理项目时,CMake会读取CMakeLists.txt文件来确定各种项目设置。需要把MainWindow.ui包含进项目时,在CMakeLists.txt中添加入上图的第21行时,才能真正实现。

2. 与对应的界面类进行关联

UI文件MainWindow.ui对应的类文件为MainWindow.hMainWindow.cpp文件。

// MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include QT_BEGIN_NAMESPACE						//**********
namespace Ui { class MainWindow; }		//         *
QT_END_NAMESPACE						//**********class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:								//**********Ui::MainWindow * ui;				//       ***
};										//**********
#endif // MAINWINDOW_H
// MainWindow.cpp
#include "MainWindow.h"
#include "./ui_MainWindow.h"							//**********MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)		//**********
{
}MainWindow::~MainWindow()
{
}

用注释标注过的地方即为需要更改的地方。

虽然默认的UI文件是个空的界面,但道理,这个时候应该已经使用UI文件,并可以构建项目了。但若此时真的构建项目,那么会出现下面的编译时错误。编译错误
通过错误信息,我们不难看出是我们新包含的./ui_MainWindow.h头文件不合适。此头文件是由Qt Creator自动创建的,而且也没有自动包含进项目中。在笔者的磁盘上项目的路径是E:\Project\Qt\Demo018,而这个头文件的位置为E:\Project\Qt\build-Demo018-Desktop_Qt_6_4_0_MinGW_64_bit-Debug\Demo018_autogen\include\ui_MainWindow.h。如果我们打开这个头文件则如下所示:

/********************************************************************************
** Form generated from reading UI file 'MainWindow.ui'
**
** Created by: Qt User Interface Compiler version 6.4.0
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H#include 
#include 
#include QT_BEGIN_NAMESPACEclass Ui_Form
{
public:void setupUi(QWidget *Form){if (Form->objectName().isEmpty())Form->setObjectName("Form");Form->resize(400, 300);retranslateUi(Form);QMetaObject::connectSlotsByName(Form);} // setupUivoid retranslateUi(QWidget *Form){Form->setWindowTitle(QCoreApplication::translate("Form", "Form", nullptr));} // retranslateUi};namespace Ui {class Form: public Ui_Form {};
} // namespace UiQT_END_NAMESPACE#endif // UI_MAINWINDOW_H

不难看出其中的问题:ui_MainWindow.h头文件中提到的都是Form,而不是我们在源代码文件MainWindow.cpp中提到的MainWindow。在看这个头文件的注释中的这一句Form generated from reading UI file 'MainWindow.ui',我们可以推断出错误的根源是在UI文件MainWindow.ui中。

我们以普通文本编辑器模式打开MainWidnow.ui文件,如下图所示:

Form00400300Form

在文件的第4行为Form,而在第5为这才是我们无法编译的真正原因!!!

3. 修改UI文件

MainWidnow.ui文件第4行中的Form改为我们使用的MainWindow。如下所示:

MainWindow00400300Form

此时,就可以成功构建项目了。运行项目后,如下图所示:
成功构建项目
细心的同学可以发现,我们设置的窗口的标题是Form,而不是Demo018。而在MainWidnow.ui中我们确实看到了相关的代码:

  Form

以界面编辑器方式打开这个文件后,在属性栏中我们也找到了相关设置:
界面编辑器中的属性设置
这说明,界面类并没有从UI文件中读取界面设计。

4. 设置界面类读取UI文件

#include "MainWindow.h"
#include "./ui_MainWindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);		//**********
}MainWindow::~MainWindow()
{
}

在类MainWindow的构造函数中添加一行ui->setupUi(this);
此时构建项目并运行,如下图所示:
成功
此图说明,至此,我们才真正地将UI文件添加进项目中。

总结

  1. 添加UI文件;
  2. 将UI文件与界面类进行关联;
  3. 修改UI文件中还未自动更正过来地信息;
  4. 设置界面类读取UI文件。

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...