Qt学习14:Designer设计师

news2024/10/7 8:30:59

文章首发于我的个人博客:欢迎大佬们来逛逛
Qt项目地址及源码:点击这里

什么是Designer设计师?

简单来说就是通过拖拖拽拽就可以实现窗口上控件的布局。

1. 创建带UI文件的项目

我们在之前的学习中都是不用这个按钮的,现在我们需要点击它,项目就会自动生成一个 widget.ui 文件。

在这里插入图片描述

项目创建完成后点击 widget.ui 文件

这个文件的大概布局如下:
在这里插入图片描述

2. UI设计器的基本使用

Contains 中我们可以让这个控件里添加一些子控件,例如 button group,因此我们添加一个按钮组,然后添加如下的按钮:

在这里插入图片描述

可以看到我们的按钮位置很乱,因此我们使用 ctrl+单击,来选择这五个按钮,然后点击上面的排列方式:垂直布局,其实就是创建了一个垂直的布局

在这里插入图片描述
在这里插入图片描述

可以看到,在按钮组中又添加了一个垂直布局,然后又包含有4个按钮。

接下来我们对按钮的样式进行更改:

直接选择某个控件,更改属性:文本,是否可选,尺寸信息(QWidget)等等

在这里插入图片描述

注意这里的名称是我们控件的对象名称,不是文本名称。

3. 关联信号与槽

如下:我们创建了一个Widget,然后在里面添加了这两个QPushButton

在这里插入图片描述

接下来我们关联他们两个的信号与槽

第一种方法:转到槽

  1. 右键按钮
  2. 选择 转到槽
  3. 我们就可以选择相应的触发信号
  4. 然后我们就直接跳转到了槽函数中,我们直接处理事件即可!

在这里插入图片描述

在这里插入图片描述

void Widget::on_pushButton_clicked()
{
    auto file = QFileDialog::getOpenFileName(this,"打开文件");
    qInfo()<<file;
}

第二种方法:通过信号与槽编辑器

  1. 点击 + 号可以添加一个信号与槽的连接。

为了变量的可读性我们更改变量的名字。

我们只需要添加这一条记录然后保存,神奇的一幕发生了! 我们无须编写任何的函数就自动连接好了,我们可以直接使用(原理下面讲)。
在这里插入图片描述


UI文件解析与designer设计师原理

你有没有想到过上面的操作原理是什么,凭什么我们点击了两下就可以实现所有的功能?

这就用到了我们的 ui 文件

在我们设计完成后返回时,会看到这样一个文件:

这就是我们刚才界面操作所生成的xml文件。

在这里插入图片描述

这个xml文件内包含了我们之前在界面操作时的所有的选择与更改内容。

在这里插入图片描述

实际上我们刚才对窗口的操作就是对xml文件的操作,它提供了可视化的方便之处。


注意到我们的widget.cpp 文件中存在一个:

#include "./ui_widget.h"

他是xml文件自动生成的一个头文件,位于:

在这里插入图片描述

然后我们打开看看。

在这里插入图片描述

可以看到里面的内容跟实际上就是我们所创建控件对象,然后分别在这两个函数中进行操作。

在这里插入图片描述

注意这个命名空间:
在这里插入图片描述

回到我们的 widget.h 文件中,发现其有一个

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget ....
private:
    Ui::Widget *ui;
}

实际上就是创建了一个刚才的UI对象,然后在构造函数中:

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

实际上就是调用了刚才的 setupUi函数。


信号与槽原理

这一个函数起到了这个作用:

QMetaObject::connectSlotsByName(Widget);

查阅文档可知:


递归搜索给定对象的所有子对象,并将来自它们的匹配信号连接到遵循以下形式的对象槽:

void on_<object name>_<signal name>(<signal parameters>);

让我们假设我们的对象有一个 QPushButton 类型的子对象,对象名为 button1。 捕捉按钮的 clicked() 信号的插槽是:

void on_button1_clicked();

如果对象本身具有正确设置的对象名称,则其自身的信号也连接到其各自的插槽。

可以发现刚才的 ”打开文件“ 的操作就是这样的。

因此我们使用这种方式可以直接手动创建信号与槽,只需遵循规则就行。


自定义控件

在使用Qt设计师进行窗口设计时,我们会通过拖拽使用设计师中的原生控件来进行界面的开发,但有时候那些标准窗口部件无法满足我们的需求,这时候就需要我们进行自定义控件的使用。而自定义控件又有两种方法,提升法插件法,接下来咱们一一学习。

创建项目:

  1. 先创建一个带界面文件的项目,然后右击项目名称,添加新文件…
  2. 选择Qt->Qt设计师界面类
  3. 界面模板选择Widget,并修改好类名,点击下一步,直至完成。
  4. 将创建的界面类的文件添加到CMakeLists.txt中,并保存
  5. 这边我要自定义的是一个开关控件,所以选择了在ui界面上添加了一个label,修改控件名称并调整合适大小

添加资源:

  1. 将下面两种图片添加到,资源文件中

    PS:记得将资源文件添加到CMakeLists.txt文件中哦

  2. 回到scheckbox.ui文件,选中lable,找到属性中的styleSheet,添加资源,选择image,点击OK

  3. 选择资源文件,这边选择check_off.png,点击OK

  4. 看到出现下列界面(有效样式表),点击OK

  5. 这里将label的文本置空,同时修改控件的objectName,可以调整一下大小

提升到” 操作:

  1. 回到widget.ui,界面中添加一个widget控件,修改名称后选中控件,右键提升为…
  2. 如图,新建提升的类,这里输入前面添加的ui界面设计师类名,点击添加
  3. 勾选中刚刚添加的ImageSwitch类,选择提升
  4. 这里可以看到widget控件已经成功提升为SCheckBox类
  5. 编译运行,可以看到程序运行后就会出现之前添加的默认关闭的一个图片,这里我们可以重写SCheckBox类的鼠标按下事件来实现图片的切换。
void SCheckBox::mousePressEvent(QMouseEvent *event)
{
    qDebug()<<"event:"<<event;
    if(switchFlag)
    {
        ui->switch_cbx->setStyleSheet("image: url(:/images/check_off.png);");
    }
    else
    {
        ui->switch_cbx->setStyleSheet("image: url(:/images/check_on.png);");
    }
     switchFlag = !switchFlag;
}

PS:没有UI界面文件的类也可以提升哦,不过需要自己在paintEvent内绘制或者通过样式表指定

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/783913.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

富文本CKEditor5简易入门,包括自定义上传图片(html版+vue.js)

一、安装及引入 官网&#xff1a;https://ckeditor.com/ckeditor-5/download/ 我这边使用的是自定义构建&#xff0c;然后下载下来。 二、简单使用 引入js <script src"../../../assets/plugins/ckeditor5/ckeditor.js"></script>html&#xff1a;…

【PWN · ret2libc】[BJDCTF 2020]babyrop

这题是经典的ret2libc&#xff0c;而且保护开的也不多&#xff0c;实际上&#xff0c;这篇博客的意义更大&#xff1a; 【PWN ret2libc】[2021 鹤城杯]babyof_Mr_Fmnwon的博客-CSDN博客 目录 前言 一、题目 二、思路 三、exp具体编写 总结 前言 简单而纯粹的ret2libc&am…

《DocRED: A Large-Scale Document-Level Relation Extraction Dataset》阅读笔记

引言 近期关注篇章级关系抽取&#xff0c;两个原因&#xff0c;一是之前做大规模知识抽取&#xff0c;遗留的一块内容就是篇章级关系抽取和事件抽取&#xff1b;另一个是大模型目前在抽取任务&#xff0c;特别是复杂抽取任务上表现不如其他NLP任务&#xff0c;这也引起我的研究…

5.2.6.字符设备驱动工作原理1

什么是模块&#xff1f;什么是驱动&#xff1f; 模块 驱动的雏形&#xff0c; 你要能操控硬件才叫驱动 在空的模块的基础上&#xff0c;安装驱动 5.2.6.1、系统整体工作原理 (1)应用层->API->设备驱动->硬件 (2)API&#xff1a;open、read、write、close等 (3)驱动…

20230720今天youtube上的中文字幕自动翻译成为英文的功能失效!

20230720今天youtube上的中文字幕自动翻译成为英文的功能失效&#xff01; 2023/7/20 12:42 &#xff1f;做YouTube挣钱吗&#xff1f; 115网盘 满了。最新 张家界 旅游的视频 放到 youtube就是 60岁/老了的时候的回忆&#xff01; 放到 大陆不保险&#xff01; 如需使用自动翻…

智能合约安全审计

智能合约安全审计的意义 智能合约审计用于整个 DeFi 生态系统&#xff0c;通过对协议代码的深入审查&#xff0c;可以帮助解决识别错误、低效代码以及这些问题。智能合约具有不可篡改的特点&#xff0c;这使得审计成为任何区块链项目安全流程的关键部分。 代码审计对任何应用…

Spring(二):更简单的存储与读取 Bean

通过上一章的Spring&#xff0c;我们基本实现了Spring 的读取与存储&#xff0c;但是在操作过程中&#xff0c;读取与存储并没有那么得“简单” 一套流程还是很复杂&#xff0c;所以&#xff0c;本章来介绍更加简单得读取与存储。 在 Spring 中想要更简单的存储和读取对象的核…

【C++】继承基础知识及简单应用,使用reportSingleClassLayout(在Visual Studio开发人员命令提示窗口)查看派生类详细信息

author&#xff1a;&Carlton tag&#xff1a;C topic&#xff1a;【C】继承基础知识及简单应用&#xff0c;使用reportSingleClassLayout&#xff08;在Visual Studio开发人员命令提示窗口&#xff09;查看派生类详细信息 website&#xff1a;黑马程序员C date&#xf…

MySQL 读写分离

目录 一、什么是读写分离&#xff1f; 二、为什么要读写分离呢&#xff1f; 三、什么时候要读写分离&#xff1f; 四、主从复制与读写分离 五、MySQL 读写分离原理 六、企业 使用MySQL 读写分离场景 1&#xff09;基于程序代码内部实现 2&#xff09;基于中间代理层实现…

比selenium体验更好的ui自动化测试工具: cypress介绍

话说 Cypress is a next generation front end testing tool built for the modern web. And Cypress can test anything that runs in a browser.Cypress consists of a free, open source, locally installed Test Runner and a Dashboard Service for recording your tests.…

【yolov7】训练自己的数据集-实践笔记

【yolov7】训练自己的数据集-实践笔记 使用yolov7训练自己的数据集&#xff0c;以RSOD数据集为例&#xff0c;图像数量976&#xff0c;一共四类。 yolov7源码&#xff1a;https://github.com/WongKinYiu/yolov7 同时在该网址下载好预训练文件&#xff0c;直接放到yolov7-main…

【每日随笔】马太效应 ② ( 马太效应因果分析 | 规模效应 | 齿轮效应 | 资源优势 | 抗风险能力 | 领先效应 )

文章目录 一、规模效应二、齿轮效应三、资源优势四、抗风险能力五、领先效应 在本文中 , 分析马太效应产生的原因 ; 一、规模效应 自然界中的规模效应 : 体型庞大的动物 , 如 大象 , 犀牛 , 雄狮 , 河马 , 很少被弱小的动物击败 , 都是自然死亡 , 老死 , 病死 , 同类厮杀 ; 经济…

多源BFS-- 矩阵距离

关于多源BFS&#xff0c;基本上就是单源BFS的简单升级了一下&#xff0c;比如在queue中队头开始时只有一个&#xff0c;我们通过这一个队头去推导其他的东西。而多源最短路就是队头一开始有1-n个可能的数&#xff0c;一个一个去BFS。 题目思路&#xff1a; 这个题就直接把所有的…

苹果开发“Apple GPT”AI科技迎来新格局

根据彭博社的马克・古尔曼&#xff08;Mark Gurman&#xff09;报道&#xff0c;苹果内部正在开发“Apple GPT”人工智能项目&#xff0c;足以媲美 OpenAI 的 ChatGPT &#xff0c;预计明年推出。就在彭博社消息发出之后&#xff0c;苹果股价上涨了2.3%&#xff0c;市值顶峰时增…

深入解析 Kubernetes 架构:掌握主节点、工作节点和容器运行时

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

【Linux后端服务器开发】协议定制(序列化与反序列化)

目录 一、应用层协议概述 二、序列化与反序列化 Protocal.h头文件 Server.h头文件 Client.h头文件 server.cpp源文件 client.cpp源文件 一、应用层协议概述 什么是应用层&#xff1f;我们通过编写程序解决一个个实际问题、满足我们日常需求的网络程序&#xff0c;都是应…

CMU15-445 2022 Fall 通关记录 —— Project 3:Query Execution(上篇)

前言 我在初次实现的时候并没有做 三个“选做”的排行榜任务&#xff0c;所以这只是上篇内容&#xff0c;等完成 Pro4 后再完成下篇。 Project 3: Query Execution Project #3 - Query Execution | CMU 15-445/645 :: Intro to Database Systems (Fall 2022) — 项目 #3 - 查…

R语言机器学习之影像组学分析的原理详解

概要 影像组学从常规医学图像中高通量提取大量的放射学定量数据&#xff0c;并以非侵入性方式探索它们与临床结果的相关性&#xff0c;在医学研究中得到广泛的应用。 01 影像组学&#xff08;Radiomics&#xff09;的概念&#xff1a; 影像组学&#xff08;Radiomics&#xff…

JVM堆内存介绍

一&#xff1a;JVM中内存 JVM中内存通常划分为两个部分&#xff0c;分别为堆内存与栈内存&#xff0c;栈内存主要用运行线程方法 存放本地暂时变量与线程中方法运行时候须要的引用对象地址。 JVM全部的对象信息都 存放在堆内存中。相比栈内存&#xff0c;堆内存能够所大的多&am…

图为科技应邀出席第38届中国计算机应用大会

第38届中国计算机应用大会&#xff08;CCF NCCA 2023&#xff09;暨2023年人工智能应用学术会议于7月16日-19日在苏州召开。 本次会议由中国计算机学会(CCF)主办&#xff0c;CCF计算机应用专业委员会承办&#xff0c;苏州大学、苏州科技大学、南京理工大学等单位协办&#xff0…