Qt系列文章之(十) ui文件的使用

2023-11-07

上一篇文章在主函数中构造了一个简单的主窗口界面,继承了一些基本元素,如菜单栏、工具栏、悬浮窗口、主界面等元素。不过这些元素都是在栈区开辟的临时变量,放在主函数里面来实现。 这不是一种标准的UI界面开发手段。 一般在界面项目开发之中有几个典型的开发规则:

• 将控件布局设计和底层函数开发解耦;这种方式就是构造专门的类来负责界面控件布局设计,构造另外一个类来实现各个控件关联的动作函数和属性。一般第二个类直接继承第一个类(或者集成第一个类)来开发。(Python 中开发界面是继承第一个类开发,而C++中一般是在第二个类中集成第一个类,常见的集成方式是作用域,如经常见到的Ui::mainWindow *ui。)

• 在界面开发时,将绝大部分的控件设计和底层函数封装到一个专门的用户界面类中,当其他类需要使用该界面类时直接对界面类进行实例化,而不再次对界面类中的布局和方法进行开发,只是调用界面类对外开放的方法和属性。(这也是核心功能封装和工作解耦的思路)

• 在界面类中添加新的控件绝大部分都使用堆区开辟内存的方式实现,很少使用栈区指针或者临时变量的方式。

上面介绍的第一步中提到了将界面设计和后端函数解耦,Qt为了方便开发者快速开发界面,界面设计可以采用控件拖拽的方式来设计,生成.ui文件。 Qt在编译时会自动将ui文件编译成cpp和h文件。

界面设计文件(.ui)

前期文章中新建一个窗口项目的时候生成了三个文件,分别是:mainwindow.h、mainwindow.cpp和mainwindow.ui。Qt实际生成的文件还有两个:ui_mainwindow.h和moc_mainwindow.cpp。不过这两个文件都是基于前三个文件自动生成的,不需要我们去手动实现。这其中的.ui文件就是用来完成对界面内控件进行布局和设计。mainwindow.h和mainwindow.cpp文件是用来实现后端界面相关属性和方法函数代码开发。这样就可以实现界面设计和后端代码解耦开发。
在这里插入图片描述
打开上一篇帖子开发的项目,对其先做一些基本的修改:
mainwindow.h头文件添加一些私有属性:

private:
    Ui::mainWindow *ui;
    QMenu *m_fileMenu;     //添加一些menu
    QToolBar *m_fileToolBar; //添加一些工具栏
QDockWidget *m_dockWidget = nullptr;

mainwindow.cpp源文件构造函数中对其属性进行设置:

mainWindow::mainWindow(QWidget *parent)
    : QMainWindow(parent)
      , ui(new Ui::mainWindow)
      ,m_dockWidget (new QDockWidget("Dock Widget", this))
{
    ui->setupUi(this);

    m_fileMenu = menuBar()->addMenu("&File");
    m_fileMenu->addAction("newAction");
    m_fileMenu->addAction("openAct");
    m_fileMenu->addAction("saveAct");

    m_fileToolBar = addToolBar("File");
    m_fileToolBar->addAction("newAction");
    m_fileToolBar->addAction("openAct");
    m_fileToolBar->addAction("saveAct");

    m_dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea |
                                    Qt::RightDockWidgetArea);
    addDockWidget(Qt::LeftDockWidgetArea, m_dockWidget);
}

编译运行项目:
在这里插入图片描述
双击.ui文件,进入Qt界面设计工具:
在这里插入图片描述

左侧是一些典型控件图标,可以直接通过拖拽进入界面设计区域。关于Qt界面设计工具的使用,本系列文章不会做详细介绍,这方面网上有很多例子和教学视频,对于大部分使用者来说很容易上手。在主界面拖入一个文本编辑框,并应用全局布局让文本编辑框布满整个主界面中心区域。
在这里插入图片描述

编译运行代码,得到几乎和上一文章中一样的界面效果:
在这里插入图片描述

本文用到的头.h文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include <QtCore>
#include <QMenu>
#include <QMenuBar>
#include <QToolBar>
#include <QDockWidget>
#include <QPlainTextEdit>
#include <QAction>

QT_BEGIN_NAMESPACE
namespace Ui { class mainWindow; }
QT_END_NAMESPACE

class mainWindow : public QMainWindow
{
    Q_OBJECT

public:
    mainWindow(QWidget *parent = nullptr);
    ~mainWindow();

private:
    Ui::mainWindow *ui;
    QMenu *m_fileMenu;     //添加一些menu
    QToolBar *m_fileToolBar; //添加一些工具栏
    QDockWidget *m_dockWidget = nullptr;
};
#endif // MAINWINDOW_H

本文用到的.cpp文件:

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

mainWindow::mainWindow(QWidget *parent)
    : QMainWindow(parent)
      , ui(new Ui::mainWindow)
      ,m_dockWidget (new QDockWidget("Dock Widget", this))
{
    ui->setupUi(this);

    m_fileMenu = menuBar()->addMenu("&File");
    m_fileMenu->addAction("newAction");
    m_fileMenu->addAction("openAct");
    m_fileMenu->addAction("saveAct");

    m_fileToolBar = addToolBar("File");
    m_fileToolBar->addAction("newAction");
    m_fileToolBar->addAction("openAct");
    m_fileToolBar->addAction("saveAct");

    m_dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea |
                                    Qt::RightDockWidgetArea);
    addDockWidget(Qt::LeftDockWidgetArea, m_dockWidget);
}

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

主函数main.cpp:

#include "mainwindow.h"

#include <QApplication>
#include <QMainWindow>
#include <QtCore>
#include <QMenu>
#include <QMenuBar>
#include <QToolBar>
#include <QDockWidget>
#include <QPlainTextEdit>
#include <QAction>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    mainWindow w;

//    //在左侧添加一个悬浮窗口



//    //在中间添加一个文本编辑框
//    QPlainTextEdit textArea;
//    w.setCentralWidget(&textArea);

    w.show();
    return a.exec();
}

本文中开发的的.ui文件XML代码(用户另存为.ui文件即可打开):

<?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>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>mainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QGridLayout" name="gridLayout">
    <item row="0" column="0">
     <widget class="QPlainTextEdit" name="plainTextEdit">
      <property name="plainText">
       <string>Welcome to Qt world!</string>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>800</width>
     <height>22</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

此文主要介绍了如何使用ui文件实现前段界面控件设计和后端自定义代码开发的解耦,尚未介绍太多后端代码开发,将在后期文章中依次介绍。


欢迎同好沟通交流,批评指正,欢迎关注我的公号:不如起而行之

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

Qt系列文章之(十) ui文件的使用 的相关文章

随机推荐

  • Android studio 3.5 debug 包不能安装

    debug模式下编译出的apk无法安装 可在根目录gradle properties中配置 android injected testOnly false
  • HTTP 隧道

    本文摘自书籍 HTTP 权威指南 此系列文章对应 github地址 隧道 可以通过 HTTP 应用程序访问使用非 HTTP 协议的应用程序 Web 隧道允许用户通过 HTTP 连接发送非 HTTP 流量 这样就可以在 HTTP 上捎带其他协
  • 2023牛客暑期多校训练营7 I We Love Strings

    https ac nowcoder com acm contest 57361 I 分治 容斥原理 include
  • [es6] 模板字符串内添加if判断

    我之前一只知道模板字符串中可以用三目运算符做判断 但今天有个需求要在模板字符串中添加if条件语句 于是百度了一下 在此记录一下 直接看代码吧 var html div class p 1 p p 2 p p 3 p p function i
  • Mybatis返回自增主键id的值,2种方式

    1 方式一 不建议使用 有BUG的方式 通过useGeneratedKeys true keyProperty id 来设置返回新的id值 这里有个问题就是 通过这种方式插入的值 经常会返回1 原因是因为他这里的意思是返回当前影响的行数 不
  • lc marathon 7.16

    文章目录 138 复制带随机指针的链表 https leetcode cn problems copy list with random pointer 剑指 Offer II 092 翻转字符 https leetcode cn prob
  • c++ 自定义时间格式

    1 自定义时间格式 我们可以使用strftime 函数将时间格式化为我们想要的格式 它的原型如下 size t strftime char strDest size t maxsize const char format const str
  • 关于HR系统升级为集团版的设计总结

    刚刚完了公司HR系统的升级 系统实现了从单一公司使用到多公司使用的转变 在升级的一个多月的时间内 虽然很苦 但感觉自已在系统架构上受益非浅 具体有以下感悟 一 MVC还是很重要 系统框架是五年前用delphi设计的 采用的基类加扩展类的模式
  • fluent p1模型_Fluent辐射传热模型理论以及相关设置(一)

    原标题 Fluent辐射传热模型理论以及相关设置 一 本文来源于网络 原作者 Libo CHen 感谢作者的辛苦整理和撰写 1概述 在传热的仿真中 有时候会不可避免的涉及到辐射传热 而我们对Fluent中辐射模型的了解甚少 很难得到可靠的计
  • 关于Unity-Web的Development build。

    Unity转手游之后是否该勾选development Build 首先看一看官方文档的解释 Development Build When you check the Development Build checkbox Unity gene
  • 【杂记】EMC、EMI、EMS、TVS、ESD概念学习总结

    注 杂记 系列为日常网搜资料的简单堆砌而积累成之 如有错误恭谢指出 标识为 原创 其实不完全是 只是多引用再整理 大都引自网络 侵删 EMC EMC Electromagnetic Compatibility 属于概念 为电磁兼容性 电磁兼
  • java 中unsigned类型的转换

    java 中unsigned类型的转换
  • oh-my-zsh安装与常用插件

    zsh 介绍 工欲善其事 必先利其器 zsh也是一种 shell 兼容最常用的 bash 这种 shell 的命令和操作 bash 虽然很标准 但是自己日常使用方便更重要 oh my zsh 提供了丰富的插件和提 安装 先使用命令查看系统支
  • whisper:robust speech recognition via large-sacle weak supervision

    OpenAI Whisper 精读 论文精读 45 哔哩哔哩 bilibili更多论文 https github com mli paper reading 视频播放量 68331 弹幕量 327 点赞数 2332 投硬币枚数 1192 收
  • QJsonObject的使用示例

    介绍 负责封装JSON对象 是键 值对列表 其中键是惟一的字符串 值由QJsonValue表示 1 QJsonObjec 封装了Json里的对象 接口与QMap相似 都具有size insert 和remove 等操作 还可以使用标准C 迭
  • SQL Server(三)-查询数据(2)

    函数与分组查询数据 一 系统函数 在SQL Server 2008中系统函数是指在SQL Server 2008中自带的函数 主要分为聚合函数 数据类型转换函数 日期函数 数学函数及其他一些常用的函数 1 聚合函数 对一组值进行计算 然后返
  • 雅思词汇表8000词版_你别不信,雅思光靠背单词也能上6.5!

    点击上方蓝字关注我哦 打算备考雅思 大家都是知道IELTS考试对词汇量要求是比较高的 如果自身的英语基础薄弱 想短时间内在雅思成绩上有所突破是很困难的一件事情 因此很多考生会 病急乱投医 购买各式各样雅思词汇手册进行疯狂记忆 每本单词手册都
  • Keil 重定向 fputc 函数 以及 printf 函数的代码尺寸测试

    本文的开发环境为 Keil Cortex M3 内核处理器 重定向 fputc 函数方法 如果想使用库函数 printf 必须要将 fputc 重定向到自己的串口上 术语 重定向 可以理解为用户重写 fputc 函数 在重写的函数体内调用自
  • vulnhub-KIOPTRIX: LEVEL 1.3 (#4)-KioptrixVM4靶场

    以下演示均在测试环境进行 遵纪守法 靶场下载地址 Kioptrix Level 1 3 4 VulnHub 镜像下载解压之后是一个 vhd文件 需要新建虚拟机 虚拟机操作系统任选一个linux系列的系统 一直下一步 到了设置磁盘 按照截图设
  • Qt系列文章之(十) ui文件的使用

    上一篇文章在主函数中构造了一个简单的主窗口界面 继承了一些基本元素 如菜单栏 工具栏 悬浮窗口 主界面等元素 不过这些元素都是在栈区开辟的临时变量 放在主函数里面来实现 这不是一种标准的UI界面开发手段 一般在界面项目开发之中有几个典型的开