当前位置: 首页 > news >正文

【qt】纯代码界面设计

界面设计目录

  • 一.界面设计的三种方式
    • 1.使用界面设计器
    • 2.纯代码界面设计
    • 3.混合界面设计
  • 二.纯代码进行界面设计
    • 1.代码界面设计的总思路
    • 2.创建项目
    • 3.设计草图
    • 4.添加组件指针
    • 5.初始化组件指针
    • 6.添加组件到窗口
      • ①水平布局
      • ②垂直布局
      • ③细节点
    • 7.定义槽函数
    • 8.初始化信号槽
    • 9.实现槽函数
    • 10.总结一下:

一.界面设计的三种方式

1.使用界面设计器

开发效率最高,可以进行拖件即可。
但是有的界面效果实现不了。

2.纯代码界面设计

最为强大,可以灵活自如的操控
但是开发效率低

3.混合界面设计

前两种结合生下的孩子,你们的优点都到我这里了。

今天我们先来讲讲纯代码的方式。

二.纯代码进行界面设计

1.代码界面设计的总思路

  • 首先确定需要那些组件
  • 然后定义好组件
  • 初始化组件
  • 用布局将组件添加到窗口
  • 定义槽函数
  • 关联槽函数
  • 实现槽函数

2.创建项目

项目简单,选择对话框即可
在这里插入图片描述
因为纯代码,不需要ui文件,使用取消掉Generate form
在这里插入图片描述
其他都跟原来的一样。

3.设计草图

因为我们要知道我们需要那些组件,所以说一般我们会先设计一个草图,知道自己需要用那些组件。
在这里插入图片描述
从草图中,我们可以知道,我们需要复选框 单选框 文本框 按钮

4.添加组件指针

我们知道了自己需要的,现在就开始进行添加
首先需要加相应组件的头文件。
在dialog.h中

#include <QCheckBox>  //复选框
#include <QRadioButton>//单选框
#include <QPlainTextEdit>//纯文本编辑器
#include <QPushButton>//按钮

然后在private里面把组件添加成成员数据

private:QCheckBox*chkBoxBold; //粗体复选框QCheckBox*chkBoxUnderLine;//下划线QCheckBox*chkBoxItalic;//斜体QRadioButton*rBtnRed;//红色单选框QRadioButton*rBtnBlack;//黑色QRadioButton*rBtnGreen;//绿色QPlainTextEdit*txtEdit;//纯文本编辑器QPushButton*btnOK;//确定按钮QPushButton*btnCancel;//取消QPushButton*btnExit;//退出

这样就添加完成了,变量名要自己能看懂哦

5.初始化组件指针

可以直接在Dialog的构造函数中进行初始化,但是会显的代码杂乱无章。
因此我们可以统一定义一个接口来进行初始化。
在private里定义一个void initUI()的接口
在Dialog的构造函数进行调用。
在这里插入图片描述
然后现在在initUI函数里面做具体实现:
在dialog.cpp中

void Dialog::initUI()
{chkBoxBold=new QCheckBox;chkBoxItalic=new QCheckBox;chkBoxUnderLine=new QCheckBox;rBtnRed=new QRadioButton;rBtnBlack=new QRadioButton;rBtnGreen=new QRadioButton;txtEdit=new QPlainTextEdit;btnOK=new QPushButton;btnCancel=new QPushButton;btnExit=new QPushButton;}

6.添加组件到窗口

其实添加组件到窗口有一个接口,就是setGenmetry()
但是这样的进行添加的话,有两大缺点
首先,你需要设置具体的位置
其次,你如果对窗口进行拉升是不会自动适应的
因此我们要学会使用布局

①水平布局

可以先理解为,将在同一行的多个组件放在一起,就是在一个布局里。
水平布局的头文件

#include <QHBoxLayout>

创建一个水平布局,将同一行的组件添加到布局中

void Dialog::initUI()
{chkBoxBold=new QCheckBox;chkBoxItalic=new QCheckBox;chkBoxUnderLine=new QCheckBox;rBtnRed=new QRadioButton;rBtnBlack=new QRadioButton;rBtnGreen=new QRadioButton;txtEdit=new QPlainTextEdit;btnOK=new QPushButton;btnCancel=new QPushButton;btnExit=new QPushButton;QHBoxLayout *HLay1=new QHBoxLayout;HLay1->addWidget(chkBoxUnderLine);HLay1->addWidget(chkBoxItalic);HLay1->addWidget(chkBoxBold);QHBoxLayout *HLay2=new QHBoxLayout;HLay2->addWidget(rBtnBlack);HLay2->addWidget(rBtnRed);HLay2->addWidget(rBtnGreen);QHBoxLayout *HLay3=new QHBoxLayout;HLay3->addWidget(btnOK);HLay3->addWidget(btnCancel);HLay3->addWidget(btnExit);}

addWidget的意思是添加组件的意思。
注意添加组件顺序是从左到右的。
这里就把组件都添加到水平布局上面了

②垂直布局

接下来开始垂直布局,就是将从上到下的布局或者组件添加到垂直的布局中。

QVBoxLayout*VLay=new QVBoxLayout;VLay->addLayout(HLay1);VLay->addLayout(HLay2);VLay->addWidget(txtEdit);VLay->addLayout(HLay3);

然后将垂直布局添加到对话窗口中就可以进行显示了

setLayout(VLay);

运行结果:
在这里插入图片描述

③细节点

效果图很明显没有对应的文字,不用慌,我们在初始化的时候配上文字。

void Dialog::initUI()
{chkBoxBold=new QCheckBox("粗体");chkBoxItalic=new QCheckBox("斜体");chkBoxUnderLine=new QCheckBox("下划线");rBtnRed=new QRadioButton("红色");rBtnBlack=new QRadioButton("黑色");rBtnGreen=new QRadioButton("绿色");txtEdit=new QPlainTextEdit;btnOK=new QPushButton("确定");btnCancel=new QPushButton("取消");btnExit=new QPushButton("退出");QHBoxLayout *HLay1=new QHBoxLayout;HLay1->addWidget(chkBoxUnderLine);HLay1->addWidget(chkBoxItalic);HLay1->addWidget(chkBoxBold);QHBoxLayout *HLay2=new QHBoxLayout;HLay2->addWidget(rBtnBlack);HLay2->addWidget(rBtnRed);HLay2->addWidget(rBtnGreen);QHBoxLayout *HLay3=new QHBoxLayout;HLay3->addWidget(btnOK);HLay3->addWidget(btnCancel);HLay3->addWidget(btnExit);QVBoxLayout*VLay=new QVBoxLayout;VLay->addLayout(HLay1);VLay->addLayout(HLay2);VLay->addWidget(txtEdit);VLay->addLayout(HLay3);setLayout(VLay);
}

运行结果:
在这里插入图片描述
布局的好处就是我可以拉大窗口,组件跟着变
在这里插入图片描述
如果水平某个地方你希望空着,不均匀分布。那可以在水平布局里面添加一个拉升器。
在按钮的水平布局里面第三个位置添加了一个拉升器。

QHBoxLayout *HLay3=new QHBoxLayout;HLay3->addWidget(btnOK);HLay3->addWidget(btnCancel);HLay3->addStretch();//添加拉升器HLay3->addWidget(btnExit);

运行效果:
在这里插入图片描述
是不是很神奇,哈哈哈!
还可以设置默认文本

txtEdit=new QPlainTextEdit;
txtEdit->setPlainText("给我点点关注,我也给你点点关注");

运行结果:
在这里插入图片描述
单选框也可以被默认选中。

rBtnBlack=new QRadioButton("黑色");
rBtnBlack->setChecked(true);//黑色默认被选中

运行结果:
在这里插入图片描述

OK,现在咱们的界面就设计好了,开始我们的功能具体实现了!

7.定义槽函数

public slots:
void onChkBoxBold(bool checked);
void onChkBoxUnderLine(bool checked);
void onChkBoxItalic(bool checked);
void setTxtColor();

因为复选框可以打开也可以关闭所以说,我们要接受一个bool值,来确定当前的状态。
对于单选框我们只能选一个,功能都是相同的,所以可以只用定义一个槽函数即可。
对于按钮,已经内置了可以用的槽函数,就不需要定义。

8.初始化信号槽

对信号槽的初始化,就是信号槽的关联。
我们也统一定义一个函数(initSignalSlots)去统一关联。

void Dialog::initSignalSlots()
{//关联复选框connect(chkBoxBold,SIGNAL(clicked(bool)),this,SLOT(onChkBoxBold(bool)));connect(chkBoxItalic,SIGNAL(clicked(bool)),this,SLOT(onChkBoxItalic(bool)));connect(chkBoxUnderLine,SIGNAL(clicked(bool)),this,SLOT(onChkBoxUnderLine(bool)));//关联单选框connect(rBtnRed,SIGNAL(clicked()),this,SLOT(setTxtColor()));connect(rBtnBlack,SIGNAL(clicked()),this,SLOT(setTxtColor()));connect(rBtnGreen,SIGNAL(clicked()),this,SLOT(setTxtColor()));//关联按钮connect(btnOK,SIGNAL(clicked()),this,SLOT(close()));connect(btnCancel,SIGNAL(clicked()),this,SLOT(close()));connect(btnExit,SIGNAL(clicked()),this,SLOT(close()));
}

记得要在dialog的构造函数中进行调用。

9.实现槽函数

ok,现在框架都搭好了,开始实现我们的槽函数了。
对于复选框我们要先拿到文本的字体,然后再继续修改,然后又设置回去。

#include <QPalette>
...
void Dialog::onChkBoxBold(bool checked)
{QFont font=txtEdit->font();//取出文本的字体font.setBold(checked);//根据checked来设置字体为粗体txtEdit->setFont(font);//将字体设回到文本中
}void Dialog::onChkBoxUnderLine(bool checked)
{QFont font=txtEdit->font();font.setUnderline(checked);txtEdit->setFont(font);
}
void Dialog::onChkBoxItalic(bool checked)
{QFont font=txtEdit->font();font.setItalic(checked);txtEdit->setFont(font);
}
void Dialog::setTxtColor()
{QPalette palette=txtEdit->palette();//拿到文本的调色板//判断哪一个按钮被点击if(rBtnRed->isChecked()){palette.setColor(QPalette::Text,Qt::red);}else if(rBtnBlack->isChecked()){palette.setColor(QPalette::Text,Qt::black);}else if(rBtnGreen->isChecked()){palette.setColor(QPalette::Text,Qt::green);}//将调色板设回文本txtEdit->setPalette(palette);
}

颜色的实现思路差不多,先用palette取出调色板,然后设置,Text是对文本有效
记得有调色板要头文件哦!
运行结果:
在这里插入图片描述
完美呀,哈哈哈,终于完成了,你也试试看吧!

10.总结一下:

用纯代码来设计界面是,我们是要遵循一个逻辑循序的,这样你的代码就会条理清晰,且可维护性高。
其次就是组件和布局的应用也是界面设计的重点。

你看不到希望,只是因为你才刚刚开始,仅此而已,加油!在这里插入图片描述

相关文章:

【qt】纯代码界面设计

界面设计目录 一.界面设计的三种方式1.使用界面设计器2.纯代码界面设计3.混合界面设计 二.纯代码进行界面设计1.代码界面设计的总思路2.创建项目3.设计草图4.添加组件指针5.初始化组件指针6.添加组件到窗口①水平布局②垂直布局③细节点 7.定义槽函数8.初始化信号槽9.实现槽函数…...

【深度学习】SDXL中的Offset Noise,Diffusion with Offset Noise,带偏移噪声的扩散

https://www.crosslabs.org//blog/diffusion-with-offset-noise 带有偏移噪声的扩散 针对修改后的噪声进行微调&#xff0c;使得稳定扩散能够轻松生成非常暗或非常亮的图像。 作者&#xff1a;尼古拉斯古藤伯格 | 2023年1月30日 马里奥兄弟使用稳定扩散挖掘隧道。左图显示了未…...

开发属于自己的Spring Boot Starter-18

为什么要开发专用的Spring Boot Starter Spring在通常使用时&#xff0c;一般是通过pom.xml文件中引入相关的jar包&#xff0c;然后再通过application.yml文件配置初始化bean的配置&#xff0c;但随着项目越来越复杂或是项目组中的应用数量越来越多&#xff0c;可能会带来几个…...

C中Mysql的基本api接口

一、初始化参数返回值 二、链接服务器三、执行SQL语句注意事项 四、获取结果集4.1mysql_affected_rows和mysql_num_rows4.2mysql_store_result与mysql_free_result注意事项注意事项整体的工作流程 4.3mysql_use_result&#xff08;&#xff09;4.4mysql_field_count&#xff08…...

grafana10.x报错 Failed to upgrade legacy queries Datasource x was not found

问题 grafana 从6.x升级到10.x后&#xff0c;导入json文件后报错&#xff0c;数据源x查询不到&#xff0c;grafana不显示数据&#xff1b; Templating Failed to upgrade legacy queries Datasource x was not found解决方法 可能grafana升级后数据源找不到&#xff0c;在面板…...

项目管理-案例重点知识(干系人管理)

项目管理&#xff1a;每天进步一点点~ 活到老&#xff0c;学到老 ヾ(◍∇◍)&#xff89;&#xff9e; 何时学习都不晚&#xff0c;加油 四、干系人管理 案例重点知识 干系人管理 案例 重点内容&#xff1a; &#xff08;1&#xff09;权力利益方格、权力影响方格&#xff…...

微信小程序踩坑,skyline模式下,scroll-view下面的一级元素设置margin中的auto无效,具体数据有效

开发工具版本 基础库 开启skyline渲染调试 问题描述 skyline模式下,scroll-view下面的一级元素的margin写auto的值是没有效果的(二级元素margin写auto是有效果的),关闭这个模式就正常显示 演示效果图 父元素的宽度和高度效果(宽度是750rpx,宽度占满的) 一级元素宽度和css效果…...

jspXMl标记语言基础

1.打开命令框进入数据库 打开eclipse创建需要连接的项目 粘贴驱动程序 查看驱动器 使用sql的包 int代表个 conlm代表列名 <%page import"java.sql.ResultSet"%> <%page import"java.sql.Statement"%> <%page import"java.sql.Connect…...

【DevOps】Linux 与虚拟局域网 (VLAN) 详解

目录 一、什么是VLAN&#xff1f; 二、VLAN的工作原理 三、Linux中的VLAN支持 四、内核模块 五、用户空间工具 六、创建VLAN 七、配置VLAN 八、管理VLAN 九、VLAN的应用 1、 网络隔离 2、网络管理 3、网络扩展 十、VLAN的优点和限制 十一、结论 虚拟局域网&#…...

《表格新视界:从罗列到洞察的飞跃》

在信息爆炸的当下&#xff0c;表格宛如一位低调的英雄&#xff0c;默默支撑着无数的数据世界。 曾经&#xff0c;我们只把表格当作简单的记录工具&#xff0c;一行行、一列列地填着数字与文字。但如今&#xff0c;表格已华丽转身&#xff0c;成为了展现数据魅力的舞台。 它不…...

风电功率预测 | 基于GRU门控循环单元的风电功率预测(附matlab完整源码)

风电功率预测 风电功率预测 | 基于GRU门控循环单元的风电功率预测(附matlab完整源码)完整代码风电功率预测 | 基于GRU门控循环单元的风电功率预测(附matlab完整源码) 完整代码 clc; clear close allX = xlsread(风电场预测.xlsx)...

0基础安装 composer

解决&#xff1a; composer 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 php composer.phar可以运行 安装环境&#xff1a;系统w11 官网地址&#xff1a;Composer 1.安装composer 1.1打开命令行窗口 在命令行窗口里&#xff0c;右键是粘贴&#xff0…...

MYSQL-9.问题排查

问题排查的思路与方向 问题排查思路 分析问题&#xff1a;根据理论知识经验分析问题&#xff0c;判断问题可能出现的位置或可能引起问题的原因&#xff0c;将目标缩小到一定范围&#xff1b;排查问题&#xff1a;基于上一步的结果&#xff0c;从引发问题的“可疑性”角度出发…...

制造企业数据管理:从数据到价值的转化

在数字化浪潮席卷全球的今天&#xff0c;制造企业面临着前所未有的机遇与挑战。如何从海量的数据中提取有价值的信息&#xff0c;将其转化为企业的核心竞争力&#xff0c;成为了每一个制造企业必须面对的问题。而数据管理&#xff0c;正是实现这一转化的关键所在。制造企业数据…...

单例模式介绍

【一】为什么要单例模式 单例设计模式&#xff1a; 一个类只允许创建一个对象&#xff08;或者实例&#xff09;&#xff0c;那这个类就是一个单例类&#xff0c;这种设计模式就叫作单例设计模式&#xff0c;简称单例模式。 当一个类的功能比较单一&#xff0c;只需要一个实例…...

Facebook企业户/在Facebook上做推广有什么好处?

想到出海&#xff0c;必会想到Facebook作为世界上最大的社交网络&#xff0c;Facebook拥有难以想象的用户数量&#xff0c;流量大到没朋友。近年来也是独立站卖家获取流量的有力工具之一。独立站卖家在Facebook上做广告的好处&#xff1f; Facebook&#xff0c;Google 开企业广…...

Go GORM实战(二) | 数据库连接的N种方式

连接数据库 使用GORM连接数据库还是比较简单的&#xff0c;概括起来就是以下三个步骤&#xff1a; 引入gorm.io/gorm和对应数据库的驱动库&#xff0c;如gorm.io/driver/sqlite。 调用对应驱动库的Open()或New()函数返回一个实现了gorm.Dialector接口的实例。 调用gorm.Open…...

Cocos Creator 2D Mask与Layout 使用详解

Cocos Creator是一款强大的2D游戏开发引擎&#xff0c;提供了丰富的功能和工具&#xff0c;使开发者可以轻松创建出高质量的游戏。其中&#xff0c;2D Mask和Layout是Cocos Creator中常用的两个组件&#xff0c;它们可以帮助开发者实现更加复杂和精美的游戏界面设计。本文将详细…...

项目-坦克大战

增加功能 我方坦克在发射的子弹消亡后&#xff0c;才能发射新的子弹。同时实现发多颗子弹 1&#xff0c;在按下J键&#xff0c;我们判断当前hero对象的子弹&#xff0c;是否已经销毁2&#xff0c;如果没有销毁&#xff0c;就不去触发shotEnemyTank3&#xff0c;如果已经销毁&…...

代码随想录算法训练营第二十九天| LeetCode491.递增子序列* 、LeetCode46.全排列*、LeetCode47.全排列 II

#LeetCode 491. Non-decreasing Subsequences #LeetCode 491. 视频讲解&#xff1a;回溯算法精讲&#xff0c;树层去重与树枝去重 | LeetCode&#xff1a;491.递增子序列_哔哩哔哩_bilibili 首先&#xff0c;本题不能考虑首先对数组排序&#xff0c;排序会导致数组直接变为一个…...

docker-compose部署nginx转发前端dist8080一直在服务器访问不了

在做不出来就要被老板扔出去了&#xff0c;nginx一直访问不了 转行写代码&#xff0c;使用docker部署所有组件&#xff0c;nginx一直出问题&#xff0c;有前辈帮我看看不 1、配置的nginx2、对应的nginx.conf的配置文件3、前端的dist放在/opt/sbcw/html/dist下就是访问不了&…...

OpenCore Legacy Patcher实战指南:突破硬件限制的4个关键步骤

OpenCore Legacy Patcher实战指南&#xff1a;突破硬件限制的4个关键步骤 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 老旧Intel Mac面临官方系统支持终止…...

告别复杂操作!Wan2.2-I2V-A14B一键生成480P高清视频

告别复杂操作&#xff01;Wan2.2-I2V-A14B一键生成480P高清视频 1. 视频创作新体验&#xff1a;简单三步生成专业级视频 你是否曾经为制作一段简单的视频而头疼&#xff1f;传统视频制作需要学习复杂的剪辑软件&#xff0c;花费大量时间调整参数&#xff0c;甚至需要专业的拍…...

学习Spring Ai的摸索实践

摸索AI&#xff08;一&#xff09;安装Ollama和本地大模型部署https://www.chendd.cn/blog/article/2012500757664628737.html摸索AI&#xff08;二&#xff09;Spring AI实现的Hello Worldhttps://www.chendd.cn/blog/article/2013071822723874817.html 摸索AI&#xff08;三…...

终极指南:如何无需Steam客户端轻松下载创意工坊模组

终极指南&#xff1a;如何无需Steam客户端轻松下载创意工坊模组 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否曾因Steam客户端无法访问创意工坊而烦恼&#xff1f;或者…...

3个核心技巧:快速掌握Blender 3MF插件的完整工作流

3个核心技巧&#xff1a;快速掌握Blender 3MF插件的完整工作流 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 你是否在为3D打印工作流中的文件格式转换烦恼&#xff1f;…...

Bili2text:重构B站视频内容提取流程的智能解决方案

Bili2text&#xff1a;重构B站视频内容提取流程的智能解决方案 【免费下载链接】bili2text Bilibili视频转文字&#xff0c;一步到位&#xff0c;输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 在信息爆炸的视频时代&#xff0c;教育工作者、…...

如何成为一名出色的SEO优化师

如何成为一名出色的SEO优化师 在当今的数字化时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已经成为了每个企业和个人网站获得流量和提升品牌知名度的关键手段。但是&#xff0c;成为一名出色的SEO优化师并非易事&#xff0c;需要掌握一系列专业知识和技能。本文将…...

Python 3.14 JIT性能调优进入倒计时:CPython核心组已宣布v3.15将移除--enable-jit-experimental标志,现在不掌握就永久错过

第一章&#xff1a;Python 3.14 JIT编译器的演进脉络与战略意义Python 3.14 并非官方发布的正式版本——截至 2024 年&#xff0c;CPython 最新稳定版为 3.12&#xff0c;3.13 处于预发布阶段&#xff0c;而 3.14 尚未进入开发路线图。因此&#xff0c;“Python 3.14 JIT 编译器…...

OpenClaw故障排查:百川2-13B-4bits模型接口连接问题解决

OpenClaw故障排查&#xff1a;百川2-13B-4bits模型接口连接问题解决 1. 问题背景与现象描述 上周在尝试将本地部署的百川2-13B-4bits量化模型接入OpenClaw时&#xff0c;遇到了典型的Connection refused错误。这个问题困扰了我整整两天时间&#xff0c;期间尝试了各种常见解决…...