【QT】混合UI设计

news2024/11/19 19:42:45

虽然利用Designer和代码的设计方式都可以开发GUI,但是毫无疑问的是最有效的开发方式是利用两者进行混合开发。

下面这个实验例子来自《QT5.9 C++开发指南》,我做了小部分修改,最终效果是这样:

图标导入

这次我们要开发的是一个有工具栏、菜单栏、标题栏等组成的GUI,所以毫无疑问我们需要选取的基类是Mainwindow。

因为我们看到工具栏里很多地方都有图标的参与,所以我们第一步需要先将要用到的图标导入到QT中。所以我们需要先在项目下面新建一个Qt Resource File。

然后再点击左下角的添加->添加前缀,先为我们的图标添加一个存储的文件夹及其名称,这里我的前缀是/img。然后就可以再次按添加->添加文件了。

静态组件布置

将我们的文件添加进来后,我们就可以先用Designer对我们的UI进行初步设计了。我们首先是进行静态组件的布置,但是这里我们需要引入一个新的抽象类Action。我们可以初步将其理解为也是一个控件,它是多用于菜单栏、工具栏和状态栏上的事件触发控件,常用于mainwindow基类中。因为我们可能需要用到一些在工具栏上的控件,所以我们需要使用到Action。

如果我们想创建一个Action的类,我们需要打开Designer界面下面的Action Editor栏,点击那一栏左上角的新建Action控件。

 

新建Action控件的框有一些选项需要我们输入,首先是文本,它将显示该Action控件所显示的文字;其次是对象名称Object name,它表示该类的对象名;再者是Tooltip,它表示当我们鼠标移到该控件后所显示的提示文字;然后是图标,图标我们可以直接从我们之前导入的图片中选取;还有就是Checkable,它将表示我们新创建的Action是否是一个复选按钮;最后就是shortcut快捷键设置了。

当我们设置好这些后,我们就可以得到下面的栏:

然后我们就可以在在中间设计区域鼠标右键创建一个工具栏和任务栏,再将这些Action拖上去:

 但是有时候我们拖上去工具栏的图标不一定同时是显示图标和文字,这与工具栏的设置风格有关,我们可以通过调整下面位置的内容来进行修改:选中工具栏,找到按钮风格,选择文字显示于按钮下方的风格(这里比较常用的风格有:ToolButtonIconOnly-只显示图标、ToolButtonTextOnly-只显示文字、ToolButtonTextUnderIcon-文字于图片下方、ToolButtonTextBesideIcon-图片于文字隔壁\)设置好并且拖好各个Action到菜单栏和工具栏后即可得到新的GUI。

 

 接下来就是需要设置一个调整字体大小和字体类型的控件了。实际上,存放数字的控件是spinbox,而存放不同字体的控件是fontcombox,但是当我们往窗口工具栏上拖拽这些控件时我们会发现它拒绝了!这里就体现了Designer设计的局限性,一些控件无法被放置到工具栏、菜单栏、状态栏等地方。所以下面的控件就需要我们自己通过代码的方式手动添加到相应的位置。

接下来我们要添加的是四个控件它们分别是:

①位于状态栏的标签

②位于状态栏的加载进度条

③位于工具栏的数字选择器

④位于工具栏的字体选择器

⑤位于工具栏的分隔符

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

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //setCentralWidget();
    lab = new QLabel("当前文件:");
    lab->setMinimumWidth(150);
    ui->statusBar->addWidget(lab);

    pro = new QProgressBar();
    pro->setMinimum(5);
    pro->setMaximum(50);
    pro->setMinimumWidth(500);
    pro->setValue(9);
    ui->statusBar->addWidget(pro);
    ui->toolBar->addSeparator();
    spin = new QSpinBox();
    spin->setMaximum(50);
    spin->setMinimum(0);
    spin->setMinimumWidth(50);
    ui->toolBar->addWidget(new QLabel("字体大小:"));
    ui->toolBar->addWidget(spin);

    ui->toolBar->addSeparator();
    fon = new QFontComboBox();
    fon->setMaximumWidth(100);
    ui->toolBar->addWidget(new QLabel("字体:"));
    ui->toolBar->addWidget(fon);
    ui->toolBar->addSeparator();
}

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

 最终做出来的效果是:

信号函数与槽函数设置

前面我们已经完成了通过Designer和代码方式设计出了静态的页面,接下来就是参考如何将其的具体功能实现出来了。

首先是复制粘贴退出清空等具有系统默认槽函数的Action的设置,具体就是在Designer的信号与槽模块里面设置对应的函数即可。

 

然后我们可以先设置字形,具体是选定需要修改的Action按钮的位置,右键点击转到对应的槽写槽函数即可。但是要注意而Action的信号触发方式是triggered而不是clicked,所以我们使用信号函数的时候需要特别注意。

void MainWindow::on_blod_triggered(bool checked)
{
    QFont font = ui->textEdit->font();
    font.setBold(checked);
    ui->textEdit->setFont(font);
}

void MainWindow::on_underline_triggered(bool checked)
{
    QFont font = ui->textEdit->font();
    font.setUnderline(checked);
    ui->textEdit->setFont(font);
}

void MainWindow::on_Italic_triggered(bool checked)
{
    QFont font = ui->textEdit->font();
    font.setItalic(checked);
    ui->textEdit->setFont(font);
}

接下来我们需要修改的是字体和字的大小,我们分别按照之前写字形的方式写对应的槽函数即可,但是要着重注意触发的信号函数即可。比如字数变化触发的信号函数就是valueChanged,而字体变化是currentIndexChanged。并且它们信号函数触发的传递参数一个是字数大小,一个是选择的字体,所以对应槽函数参数也需要进行一定修改。

void MainWindow::change_size(int size)
{
    QFont font = ui->textEdit->font();
    font.setPointSize(size);
    ui->textEdit->setFont(font);
    pro->setValue(size);
}

void MainWindow::change_family(QString family)
{
    ui->textEdit->setFontFamily(family);
}

------------------------------------------------
QObject::connect(spin,SIGNAL(valueChanged(int)),
this,SLOT(change_size(int)));
QObject::connect(fon,SIGNAL(currentIndexChanged(QString)),
this,SLOT(change_family(QString)));

整个最后呈现出来的效果如下图:

 

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

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

相关文章

AprilTag码估算平面法向量+相机标定

由于本人部分原创博客发布在古月居论坛,详细内容点击链接跳转: 1. AprilTag探索和原理分析 2. 相机标定,基于AprilTag估算平面法向量

web安全php基础_php常量及可变变量(魔术变量)

常量 php中常量是一个简单值的标识符。该值在脚本中不能改变。 一个常量由英文字母、下划线、和数字组成,但数字不能作为首字母出现。 (常量名不需要加 $ 修饰符)。 常量有两点需要特别注意的地方 常量在整个脚本中都可以使用。常量值被定义后,在脚本的其他任何…

企业级CDP数据工程实践(一):建设中的最佳实践

大家好,许久未见,我是云祁~ 今天想和大家分享下 企业级CDP项目 建设中的数据工程实践。 在很多情况下,大家可能会将数据工程与ETL的过程画上等号,但实际上ETL只是数据工程的一部分,其工作量通常仅占整个数据…

I.MX6ULL_Linux_驱动篇(40)异步通知

在前面使用阻塞或者非阻塞的方式来读取驱动中按键值都是应用程序主动读取的,对于非阻塞方式来说还需要应用程序通过 poll 函数不断的轮询。最好的方式就是驱动程序能主动向应用程序发出通知,报告自己可以访问,然后应用程序在从驱动程序中读取…

Linux——进程信号(下)

目录 总结 一,信号保存 1.1 阻塞信号 2.2 信号在内核(操作系统)中的表示 2.3 系统接口 2.3.1 sigset_t信号集 2.3.2 信号集的操作函数 2.3.3 sigprocmask 2.3.4 sigpending 2.4 实验样例 三,信号处理 3.1 信号捕捉 3.2 sigaction接口 3.3 实验…

2022年真题 - 17 - 系统优化

系统优化 题目配置验证配置 题目 StorageSrv - 系统优化 系统资源限制设置:设置所有用户的硬件跟软件的最大进程数、最大文件打开数为65535;开启 IPv4 恶意 icmp 错误消息保护;开启 SYN 洪水攻击保护;允许系统打开的端口范围为 …

服务网关 Gateway

服务网关 Gateway 服务网关介绍Gateway 介绍Gateway 和 Nginx 网关的区别Gateway 核心概念Gateway工作流程 Gateway 案例Predicate(断言)After 路由谓词工厂Before路由谓词工厂Between 路由谓词工厂Cookie路由谓词工厂Header 路由谓词工厂Host 路由谓词工…

支付宝支付(六):小程序支付(Go+Gin+内网穿透)

一、前置条件 (1)go语言,1.18 (2)Gin、第三方依赖包:gopay【github.com/go-pay/gopay/alipay】https://github.com/go-pay/gopay/blob/main/doc/wechat_v3.md (3)支付宝支付相关信…

Java面向对象程序开发——JDK8新特性

文章目录 网络编程入门知识JDK8新特性Lambda表达式以多线程为例:Lambda结合for循环: Stream流获取一个流的2种常用的方式:常用方法终结方法延迟方法 案例 网络编程入门知识 软件结构、协议分类、网络通信协议、网络编程三要素、TCP通信协议、…

爬虫的分布式思维与实现思路

爬虫的分布式思维与实现思路 基本构架 scrapy-redis实现分布式,其实从原理上来说很简单,这里为描述方便,我们把自己的核心服务器称为master,而把用于跑爬虫程序的机器称为slave 我们知道,采用scrapy框架抓取网页&…

netty学习(4):通过SpringBoot Web发送消息实现netty实现多个客户端与服务器通信

1. 基于netty学习(3):SpringBoot整合netty实现多个客户端与服务器通信的学习,要想通过http在netty客户端之间发送消息,需要实现spring-boot-starter-web,封装消息格式,自动调用netty客户端 2. 封装一个简单…

算法笔记——哈希表篇

一般哈希表都是用来快速判断一个元素是否出现集合里,哈希表并不意味着一定要使用HashMap,有时候使用数组更方便,有时候要使用set,依据具体情况而定,哈希表是典型的空间换时间。 数组作为哈希表 一些应用场景就是为数组…

工具 | 应用程序无法启动,应为应用程序的并行配置不正确

工具 | 应用程序无法启动,应为应用程序的并行配置不正确 “E:\02-Doc\朱老师物联网大讲堂-全部视频\朱有鹏老师嵌入式linux核心课程\开发版光盘资料\X210V3S_A\tools\x210_Fusing_Tool.exe”的激活上下文生成失败。 找不到从属程序集 Microsoft.VC90.MFC,processorA…

DNS-去中心化域名系统,创建您在DeSoc 社会中的YUAN ID

传统域名系统 (DNS) 是一个分层的分散信息存储,用于将用户在网络浏览器中输入可读名称(例如 www.baidu.com)解析为IP地址,来访问互联网上的计算机。传统DNS使用一种分布式数据库,有严格的上下级关系,上级仅…

[Android JNI] --- JNIEnv和JavaVM

1 JVMEnv 1.1 JNIEnv 是什么 JNIEnv 即 Java Native Interface Environment,Java 本地编程接口环境。JNIEnv 内部定义了很多函数用于简化我们的 JNI 编程。 JNIEnv是提供JNI Native函数的基础环境,线程相关,不同线程的JNIEnv相互独立&#…

SpringBoot快速回顾(@value读取配置文件)

目录 1.定义配置文件2. 定义Controller类3. 测试4. 优化4.1 封装实体类4.3 定义controller类4.2 测试 本文将介绍如何使用value读取配置文件的内容。 在实际项目中,往往会在配置文件中写项目部署需要配置的环境信息(数据库驱动,数据库账号密码…

医疗金融法律大模型:从ChatDoctor到FinBERT/FinGPT/BloombergGPT、ChatLaw/LawGPT_zh

第一部分 各种医疗类ChatGPT:或中英文数据微调LLaMA、或中文数据微调ChatGLM 1.1 基于LLaMA微调的中英文版ChatDoctor 1.1.1 ChatDoctor:通过self-instruct技术提示API的数据和医患对话数据集微调LLaMA Github上有一个基于LLaMA模型的医疗微调模型&am…

zabbix (自定义监控内容-配置邮件报警-自动发现与自动注册)

目录 zabbix 客户端主机配置自定义监控内容设置邮件报警zabbix 自动发现与自动注册zabbix 自动发现(对于 agent2 是被动模式)//zabbix 自动发现(对于 agent2 是被动模式)zabbix 自动注册(对于 agent2 是主动模式&#…

IDEA+springboot+jpa+Layui+Mysql销售考评系统源码

IDEAspringbootjpaLayuiMysql销售考评系统源码 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.评分结果3.评分管理4.添加评分5.用户管理6.添加用户7.角色管理8.添加角色8.销售管理9.添加销售 三、部分代码UserDao.javaUserController.javaUser.java 四、其他获取源码 一、…

计算机组成原理实验二:多位逻辑门构建

目录 一、实验目的 二、实验设备 三、实验原理 四、实验内容 1. 16位非门 2.16位与门 3.16位或门 4. 16位复用器 五、实验习题 1.还可以怎样设计各种芯片的物理结构 2.“block copy”(块复制)和edit菜单中“copy to clipboard”的区别 六、自…