QT在一个源文件内新建多个UI界面

1. QT当中,当我们需要一个新的UI界面时,通常可以选择新建带配套头文件和源文件的UI界面。添加步骤如图1.1所示。

图1.1 添加带头文件与源文件的界面

这种添加自动生成了h文件和cpp文件,系统自动做了以下工作:

(1) 在头文件里添加了该界面的类,包括声明和定义(示例添加的QDialog的UI界面,命名为mydialog)。头文件代码如下:

#ifndef MYDIALOG_H
#define MYDIALOG_H

#include <QDialog>

namespace Ui {
class MyDialog;  //1.命名空间里声明类名
}

class MyDialog : public QDialog  //2.类的定义
{
    Q_OBJECT

public:
    explicit MyDialog(QWidget *parent = nullptr);
    ~MyDialog();  //3.构造函数与析构函数

private:
    Ui::MyDialog *ui;  //4.ui界面的指针
};

#endif // MYDIALOG_H

(2) 在mydialog.cpp里添加类的构造与析构函数的具体内容

#include "mydialog.h"
#include "ui_mydialog.h" //此头文件即为mydialog的UI界面头文件

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

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

(3) 在mydialog的配置文件中有一句代码:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MyDialog</class>
 <widget class="QDialog" name="MyDialog">  //分别是父类和类名
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Dialog</string>
  </property>
 </widget>
 <resources/>
 <connections/>
</ui>

(4) 在pro的配置文件的FORM项添加

FORMS +=     mydialog.ui \
    widget.ui

通过以上操作,在主窗口的cpp文件中添加"mydialog.h",就能在主窗口中使用mudialog.ui了。

本例新建了一个空的widget窗口,窗口内设置一个按钮,按下按钮显示mydialog.ui。如图1.2所示。

图1.2 在空Widget中点击按钮生成Dialog

注:在新建的QT工程中,有时候可能会出现设计的UI界面与显示的UI界面不一致,如本例中设计的UI界面和运行时显示的UI界面如图1.3所示

                            

(a) 设计的主界面                                                                        (b) 运行时主界面

图1.3 设计界面与运行界面不一致

造成此问题的原因是QT对于某些高分辨率小屏幕不支持。可以在main函数的最前面添加以下声明即可解决该问题:

#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif

2. 在实际情况中,常常会遇到需要主界面在不同的操作下情况需要生成不同的新界面的情况。比如本例中如果widget中有多个按钮,每点击一个按钮生成一个不同的Dialog。这时需要设计多个UI界面。如果每个UI界面配套一个cpp和h文件,导致文件众多。此时的需求是一个cpp文件和h文件,配置任意多个UI界面。

为此,我们在之前的mydialog.cpp和mydialog.h中添加配置一个新的UI界面,命名为mydialog_new。

(1) 新建一个纯UI界面,如图2.1

图2.1 新建纯UI界面

(2) 在mydialog.h中声明构造函数

namespace Ui {
class MyDialog;
class mydialog_new; //2.1在原来的命名空间内包含类名
}

//类的声明,基本仿造mydiaog的代码,只需要修改类名即可
class mydialog_new:public QDialog
{
    Q_OBJECT
public:
    explicit mydialog_new(QWidget *parent=nullptr);
    ~mydialog_new();
private:
    Ui::mydialog_new* ui_new;  //mydialog_new的指针
};

(2) 在mydialog.cpp开头添加(即新的UI文件)

#include "ui_mydialog_new.h"

并对构造函数和析构函数进行定义(基本仿造mydialog)

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

mydialog_new::~mydialog_new()
{
    delete ui_new;
}

编译之后,主要报错如下:

error: invalid use of incomplete type ‘class Ui::mydialog_new‘   ui_new(new Ui::mydialog_new)

                   


此时去查看mydialog_new.ui的配置文件,发现如下:

可以看到,此时类名是Dialog,并不是我们的mydialog_new,修改方法为切换到UI设计界面,如图2.2所示

                                                                                                                          图2.2 修改UI界面名,与类名一致

此时再编译,没有任何问题,说明添加成功。只需要在主界面使用即可。作为演示,现在widget中再添加一个按钮,点击生成新的dialog。如图2.3 所示。

图2.3 点击mydialog_new,生成新的对话框

原文地址:https://www.cnblogs.com/yuanwebpage/p/12359139.html

时间: 2024-08-02 16:06:37

QT在一个源文件内新建多个UI界面的相关文章

在Qt中如何使用QtDesigner创建的UI文件(一) (转)

使用Qt有一些时间了,一直在IDE环境(qtcreator和VS2003+集成器)中使用,自然少了很多麻烦的步骤.但是在享受这种便利的同时,我们也失去了理解更多知识背后的点滴.在IDE中,如果我们要开发一个对话框,通常是使用 "新建->Qt->Qt设计师界面类" 这样IDE会自动的帮我们生成三个文件(filename.ui, filename.h,filename.cpp).qmake也非常智能,可以自动检测到这个用户界面文件(filename.ui)并且生产适当的make

在Qt中如何使用QtDesigner创建的UI文件

使用Qt有一些时间了,一直在IDE环境(qtcreator和VS2003+集成器)中使用,自然少了很多麻烦的步骤.但是在享受这种便利的同 时,我们也失去了理解更多知识背后的点滴.在IDE中,如果我们要开发一个对话框,通常是使用 “新建—>Qt—>Qt设计师界面类” 这样IDE会自动的帮我们生成三个文件(filename.ui, filename.h,filename.cpp).qmake也非常智能,可以自动检测到这个用户界面文件(filename.ui)并且生产适当的 makefile规则.这

QT学习之forward declaration of &#39;struct Ui::xxx&#39;;invalid use of incomplete struct &quot;Ui::Widget&quot;

解决QT:forward declaration of 'struct Ui::xxx';invalid use of incomplete struct "Ui::Widget" 等莫名奇妙错误 今天在进行QT Widget的UI设计时,改了下Widget的对象名,然后在多次成功编译运行后,执行清理,重新构建,就出现了好多莫名奇妙的错误: widget.h:12: 错误:forward declaration of 'struct Ui::Widget' widget.cpp:8:

在QT编辑UI界面Menu时,linu屏幕的录制与截图

今天遇到一个小问题:在QT里面编辑UI界面的时候,如果想一步一步记录下自己制作的过程,在申请软件著作权的时候加进去,就要截图 截图 1.可以用键盘的快捷键截图: 1.按下Print Screen键,将会截取全屏幕画面. 2.抓取当前活动窗口 Print Screen进行屏幕抓图时,同时按下Alt键,就会只抓取当前活动窗口 3.自选截图区域 Print Screen+Shift 然后可以自选截图的区域 2.也可以用screenshot 截图工具 ubuntu 10.04中在applications

新建线程与UI线程间的通信

现在用一个实例来演示一下自己的新建线程与UI线程间的通信. UI界面包含3个控件: 一个输入框,用来输入数字: 一个显示框,用来显示从2开始,到输入数字之间的所有质数: 一个按钮,点击后获取输入框输入的数字,交给新建线程处理,线程计算质数后把结果传给UI线程,UI线程显示结果到显示框. XML如下: 1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android=&q

如何判断一个点是否在一个多边形内?

提示:对多边形进行分割,成为一个个三角形,判断点是否在三角形内. 一个非常有用的解析几何结论:如果P2(x1,y1),P2(x2,y2), P3(x3,y3)是平面上的3个点,那么三角形P1P2P3的面积等于下面绝对值的二分之一: | x1  y1  1 | | x2 y2  1 | = x1y2 + x3y1 + x2y3 –x3y2 – x2y1 – x1y3 | x3 y3  1 | 当且仅当点P3位于直线P1P2(有向直线P1->P2)的右侧时,该表达式的符号为正.这个公式可以在固定的时

业余时间,决定一个人的成就(在一个领域内高深的技艺,并非瞬时灵感的迸发,而是业务时间持之以恒的学习,钻研,思考。差距,不知不觉,在一点一点的拉开)

世界很大,两次搭上同一辆出租车的几率很小.两次搭上同一辆出租车,且司机乘客彼此能记住对方的几率,就更小了. 但我不可能忘了这位兰代立,兰师傅,一位写诗与摄影爱好者,一位上车就给乘客分享他的生活态度的司机师傅,一位“人,活出自己就行”的正能量师傅. 画外音:去年<不管月薪五千还是五万,只要活出自己>一文,第一次提到过这位积极乐观的兰才人. 这一次,兰才人又分享了他最近的得意之作,根据乘客的人名作诗,大伙来感受感受: 栩栩如仙袅袅来, 如梦如幻花自开. 倾国倾城为我醉, 快乐如清笑花台. <

使用 PySide2 开发 Maya 插件系列一:QT Designer 设计GUI, pyside-uic 把 .ui 文件转为 .py 文件

使用 PySide2 开发 Maya 插件系列一:QT Designer 设计GUI, pyside-uic 把 .ui 文件转为 .py 文件 前期准备: 安装 python:https://www.python.org/downloads/ 安装 PySide2:安装 python 后,在安装目录下有 /script 文件夹,里面有 pip.exe ,cmd执行:pip install PySide,pip install PySide2(注意: python2.x 对应 PySide,py

Android开发1:基本UI界面设计——布局和组件

前言 啦啦啦~本学期要开始学习Android开发啦~ 博主在开始学习前是完完全全的小白,只有在平时完成老师要求的实验的过程中一步一步学习~从此篇博文起,博主将开始发布Android开发有关的博文,希望能在学习中和各位共同探讨,一起交流,共同进步~ 话不多说,首先进入我们的正题~Android开发一基本UI界面设计——布局和组件(Android Studio的配置安装使用等在以后为各位补上~) 基础知识 Android的组件分为布局和控件.布局,就是让控件在里面按一定的次序排列好的一种组件,本身并