Qt 通过控件按钮实现hello world + 命名规范(7)

文章目录

  • 使用编辑框来完成 hello world
    • 通过编辑图形化界面方式
    • 通过纯代码方式
  • 通过按钮的方式来创建 hello world
    • 通过编辑图形化界面方式
    • 通过纯代码方式
  • 总结Qt Creator中的快捷键
  • 如何使用文档
  • 命名规范

简介:这篇文章着重点并不在于创建hello world程序,重点是放在控件按钮(push Button)与 connect 的神级配合,这样当我们去点击界面上的按钮控件时,就会执行按钮所关联的处理函数,此时界面就会发生变化。而这个媒介就是connect,同时补充一点Qt的使用知识和规范,这样代码写的越轻松,越规范,越自信。邀请各位看官好友一起浏览

在这里插入图片描述

使用编辑框来完成 hello world

这里主要是使用编辑框来完成hello world,可以使用单行编辑框QLineEdit和多行编辑框QTextEdit

通过编辑图形化界面方式

跟之前的label控件操作并无区别,而编辑框实现hello world并不是这节的重点,通过按钮控件实现hello world才是重点所在

在这里插入图片描述

不过这里与label控件实现hello world方式不同的是,它输出的内容是可以编辑的

在这里插入图片描述

通过纯代码方式

这里纯代码方式去实现hello world的也是根据label控件依葫芦画瓢哈

// widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include<QLineEdit>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QLineEdit* LineEdit = new QLineEdit(this);LineEdit->setText("hello world");
}Widget::~Widget()
{delete ui;
}

通过按钮的方式来创建 hello world

通过编辑图形化界面方式

也通过推拽控件Push Button去创建hello world但是这里比之前的labelLine Edit控件有更加高级玩法,按钮,那肯定是按下去会出现什么反应或者变化,因此这里就牵扯到Qt 中的信号槽机制,它的本质就是给按钮的点击操作关联上一个处理函数,当用户点击的时候就会执行这个处理函数,随之发生变化

在这里插入图片描述

这里的特殊玩法就是点击这个按钮让这个文本内容(hello world)切换成 This is my world但这里并不是只去编辑图形化界面,它需要结合代码共同去完成这个操作,未来的学习很大程度上也需要借助图形化界面,先展示修改文件的代码,再对其进行阐述

void handleClick();该函数就是该按钮的点击操作关联上的一个处理函数,按钮被点击之后,就把按钮中的文本进行切换

// Widget.h(只保留关键代码)
#include <QWidget>
#include<QPushButton>class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void handleClick();
private:Ui::Widget *ui;
};
#endif // WIDGET_H
  1. 介绍connect;connect这个单词它本身就具有联系,连接的意思,在Linux的网络编程中也存在一个函数叫做connect,这个函数是用来给 TCP socket建立连接的(在写 TCP 客户端的时候,需要先建立连接,然后才能读写数据)。而Qt 中的 connect 是 QObject 这个类提供的静态函数,这个函数的作用就是连接信号与槽,不过它和 TCP 的建立连接操作没有任何关系,只是同一种术语的不同意思
  2. 解释connect的四个参数第一个参数(ui->pushButton)谁发出的信号第二个参数(&QPushButton::clicked)点击按钮的时候就会自动触发这个信号,发出了一个啥信号第三个参数(this)谁来处理这个信号第四个参数(&Widget::handleClick)接收信号后,具体怎么处理
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(ui->pushButton, &QPushButton::clicked, this, &Widget::handleClick);
}Widget::~Widget()
{delete ui;
}void Widget::handleClick()
{// 当按钮被点击之后,就把按钮中的文本进行切换if(ui->pushButton->text() == QString("hello world")){ui->pushButton->setText("This is my world");}else{ui->pushButton->setText("hello world");}
}

这里要详述ui->pushButton;就是去访问 form file(file文件)中创建的控件。通过下方的图片能看到:Qt 工具会自动帮我们生成一个类名(可以手动修改)为 pushButton(objectName) 的 QPushButton类,也就是在 Qt Designer中创建一个控件的时候,此时就会给这个控件去分配一个 objectName属性,且这个属性的值要求是在界面中得是唯一的(不能重复)。而qmake在预处理.ui文件的时候就会根据这里的 objectName生成对应的C++代码,变量 pushButton 就成为 ui 属性中的成员变量结合图片更好理解哈

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

此时按钮对象,是不需要咱们自己 new出来的, new 对象的操作已经是被 Qt 自动生成了,而且这个按钮对象已经作为ui对象里的一个成员变量了(直接继承就OK,也无需作为Widget 的成员)

通过纯代码方式

对于纯代码版本,按钮对象是咱们自己 new的,为了保证其他函数中能够访问到这个变量,就需要把按钮对象设定为 Widget 类的成员变量

// Widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QPushButton>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();// 点击按钮后要进行的切换操作void handleClick();private:Ui::Widget *ui;// 得有一个QPushButton成员变量QPushButton* myButton;};
#endif // WIDGET_H
// Widget.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 老样子,创建对象,在connectmyButton = new QPushButton(this);myButton->setText("hello world");connect(myButton, &QPushButton::clicked, this, &Widget::handleClick);
}Widget::~Widget()
{delete ui;
}void Widget::handleClick()
{if (myButton->text() == QString("hello world")){myButton->setText("This is my world");}else{myButton->setText("hello world");}
}

那实际开发中,是通过代码的方式构造界面为主,还是通过图形化界面的方式构造界面为主?首先这两种都很主要,难分主次!如果你当前程序界面,界面内容是比较固定的,此时就会以图形化的方式来构造界面。但是如果你的程序界面,经常要动态变化,此时就以代码的方式来构造界面。这两种方式,哪种方便就用哪种,而且这两种方式也可以配合使用,在后面的学习中,这两种方式会穿插使用

总结Qt Creator中的快捷键

  • 注释:ctrl + /
  • 运行:ctrl + R
  • 编译:ctrl + B
  • 字体缩放:ctrl + 鼠标滑轮
  • 查找:ctrl + F
  • 整行移动:ctrl + shift + ↑/↓
  • 自动对齐:ctrl + i
  • 查找某个函数文档:鼠标对准F1
  • 同名.h.cpp切换:F4
  • 生成函数声明的定义:alt + enter

如何使用文档

  1. 直接将光标放到要查询的类名/方法名上,直接按F1
  2. 点击Qt Creator左侧边栏中的 “帮助” 按钮
  3. 直接在搜索栏中搜索 Assistant

注意在未来的实际开发中,一定会用到很多的第三库和框架的。那很可能用到的库/框架,比较小众,这时网上就很难去找到我们所需要的相关资料,那就只能去参考官方文档,而官方文档大概率是英文的,因为如果它的程序要走向国际化,它肯定是有一份英译的参考资料,所以得去习惯去读英文文档

命名规范

去给变量/函数/文件/类 取名字,是非常有讲究的,首先起的名字要有描述性,不要使用a/b/c/d这种无规律的名字去描述变量,其次如果名字比较长的话,由多个单词构成,就需要使用适当的方式来进行区分不同的单词,因此总共有两种典型的命名风格蛇形命名法驼峰命名法

  1. 蛇形命名法偏好使用_来进行单词的分割,主要用于C/C++/Python。比如:unordered_map,priority_queue
  2. 驼峰命名法偏好使用大写字母进行单词的分割,主要用于Java/JS/Go。比如:QApplication,QWidget
  3. 两种命名方法都可以去使用,但咱讲究的是入乡随俗,进入公司后,公司的项目使用的是哪种命名风格就用哪种方法

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

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

相关文章

实时网络流量监控与防御:Python实现DDoS攻击检测

1. 需求分析 DDoS攻击通过海量请求耗尽服务器资源。本文使用 Python Scapy 实时监控流量&#xff0c;自动触发IP封禁。 2. 核心代码实现 2.1 依赖安装 pip install scapy psutil2.2 流量监控脚本&#xff08;ddos_detector.py&#xff09; import time from scapy.all im…

电赛经验分享——模块篇

1、前言 打算在这一个专栏中&#xff0c;分享一些本科控制题电赛期间的经验&#xff0c;和大家共同探讨&#xff0c;也希望能帮助刚刚参加电赛的同学&#xff0c;了解一些基本的知识。一些见解和看法可能不同或有错误&#xff0c;欢迎批评指正。 在本文中&#xff0c;主要介绍笔…

【LLM】Open WebUI 使用指南:详细图文教程

Open WebUI 是一个开源的、可扩展且用户友好的自托管 AI 平台,专为生成式人工智能模型交互而设计。 Open WebUI 旨在为用户提供一个简单易用、功能强大且高度定制化的界面,使其能够轻松与各种 AI 模型(如文本生成、图像生成、语音识别等)进行交互。 一、安装与初始化配置 扩…

HarmonyOS Next~HarmonyOS应用测试全流程解析:从一级类目上架到二级类目专项测试

HarmonyOS Next&#xff5e;HarmonyOS应用测试全流程解析&#xff1a;从一级类目上架到二级类目专项测试 引言&#xff1a;HarmonyOS生态下的质量保障挑战 在万物互联的智能时代&#xff0c;HarmonyOS作为分布式操作系统&#xff0c;为开发者带来了前所未有的创新空间&#x…

一种机载扫描雷达实时超分辨成像方法——论文阅读

一种机载扫描雷达实时超分辨成像方法 1. 专利的研究目标与产业意义1.1 研究目标与实际问题1.2 产业意义2. 专利的创新方法:滑窗递归优化与实时更新2.1 核心模型与公式2.2 与传统方法对比优势3. 实验设计与验证3.1 仿真参数3.2 实验结果4. 未来研究方向与挑战4.1 学术挑战4.2 技…

滚筒洗衣机拆解学习

本文图片来自于B站视频&#xff0c;链接在文末&#xff0c;不涉及任何公司及实验室产品 对小米滚筒洗衣机进行拆解&#xff0c;并收集了用户对这款产品的评价&#xff0c;认识了关键部件。下一步重点学习对各个电机的控制逻辑和供电系统。 整机拆解学习&#xff1a; 功能面板…

【金仓数据库征文】金仓数据库 KingbaseES 在电商平台数据库迁移与运维中深入复现剖析

【金仓数据库征文】金仓数据库 KingbaseES 在电商平台数据库迁移与运维中深入复现剖析 前言 在当今数字化商业蓬勃发展的时代&#xff0c;电商平台的数据量呈爆发式增长&#xff0c;对数据库性能、稳定性和扩展性提出了极高要求。本文章基于大型电商平台原本采用 MySQL 数据库&…

iPhone手机连接WiFi异常解决方法

iPhone手机连接WiFi异常解决方法 一、问题现象二、iPhone连不上可能的原因三、基础排查与快速修复第一步:重启大法第二步:忽略网络,重新认证第三步:关闭“私有无线局域网地址”第四步:修改DNS服务器第五步:还原网络设置四、路由器端排查及设置关闭MAC地址过滤或添加到白名…

Android NDK版本迭代与FFmpeg交叉编译完全指南

在Android开发中&#xff0c;使用NDK(Native Development Kit)进行原生代码开发是一项常见需求&#xff0c;特别是当我们需要集成FFmpeg这样的多媒体处理库时。本文将深入分析Android NDK的版本迭代分界线&#xff0c;详细讲解FFmpeg交叉编译的注意事项&#xff0c;并提供完整的…

typecho中的Widget设计文档

组成系统的最基本元素 什么是Widget Widget是组成Typecho的最基本元素&#xff0c;除了已经抽象出来的类库外&#xff0c;其它几乎所有的功能都会通过Widget来完成。在实践中我们发现&#xff0c;在博客这种小型但很灵活的系统中实施一些大型框架的思想是不合适的&#xff0c…

Python序列Day3

序列 序列是一种数据存储方式&#xff0c;用方括号标注&#xff0c;逗号分隔的一组值。在内存中&#xff0c;序列就是一块用来存放多个值的连续的内存空间。 常见序列结构有&#xff1a;字符串、列表、元组、字典、集合 列表 用于存储任意数目&#xff0c;任意类型的数据集…

私服与外挂:刑事法律风险的深度剖析

首席数据官高鹏律师团队编著 在当今数字化时代&#xff0c;网络游戏产业蓬勃发展&#xff0c;然而与之相伴的私服与外挂现象却屡禁不止&#xff0c;且其背后隐藏着严重的刑事法律风险。作为一名律师&#xff0c;有必要在此对私服与外挂相关的刑事问题进行深入解读&#xff0c;以…

Linux云计算训练营笔记day04(Rocky Linux中的命令)

mv 移动(剪切) 源数据会消失 格式: mv 源文件 目标路径 touch /opt/a.txt 创建文件 mv /opt/a.txt /root 移动文件&#xff0c;没有改名 mkdir gongli 创建目录 mv gongli /opt/ 移动目录&#xff0c;没有改名 mv /opt/gongli tedu 移动目录&#xff0c;改名了 …

蓝桥杯青少 图形化编程——“星星”点灯

蓝桥杯青少 图形化编程——“星星”点灯 编程实现&#xff1a; 有10盏灯&#xff0c;从1到10按顺序依次编号&#xff0c;初始时全部灯处于开启状态。有10个人也从1到10依次编号。第一个人&#xff08;1号&#xff09;将灯全部关闭&#xff0c;第二个人&#xff08;2号&#x…

conda配置好的pytorch在jupyter中如何配置

配置 其实不用再配置了 如下图&#xff08;主要是激活pytorch环境&#xff0c;再jupyter notebook&#xff09; jupyter运行快捷键shiftenter 新建文件夹folder&#xff0c;新建notebook 使用 帮助文档&#xff08;两种方式&#xff09; ctrl/ 注释

COLT_CMDB_aix_diskinfo.sh

#!/bin/ksh #IT_BEGIN #IT_TYPE3 #IT SYSTEM_AIX_AGENTDISKDISCOVER|discovery.diskInfo[disc] #原型指标 #IT_RULE SYSTEM_AIX_IP|ipAddress[{#DISKNAME}] #IT_RULE SYSTEM_AIX_AGENTDISKPATH|diskPath[{#DISKNAME}] #IT_RULE SYSTEM_AIX_DISKNAME|diskName[{#DISKNAME}] #IT_…

IBM BAW(原BPM升级版)使用教程第五讲

结前篇&#xff01; 一、服务&#xff1a;外部服务 在 IBM Business Automation Workflow (BAW) 中&#xff0c;外部服务&#xff08;External Services&#xff09;是指在流程中调用和集成外部系统或服务的组件。外部服务允许IBM BAW与其他业务系统、应用程序或第三方服务进行…

如何用更少的显存训练 PyTorch 模型

文章目录 1、引言 2、自动混合精度训练 3、低精度训练 4、梯度检查点 5、通过梯度累积减小批量大小 6、张量分片与分布式训练 7、高效数据加载 8、使用 In-Place 操作 9、Activation and Parameter Offloading 10、使用更精简的优化器 11、高级策略 12、总结 1、引言 在训练大…

极速轻量,Rust 网络开发新选择:Hyperlane 框架深度解析

极速轻量&#xff0c;Rust 网络开发新选择&#xff1a;Hyperlane 框架深度解析 在高性能网络服务开发领域&#xff0c;Rust 凭借其内存安全与高效并发的特性备受青睐。今天&#xff0c;我们迎来一款专为现代 Web 服务打造的明星框架——Hyperlane&#xff0c;它以“轻量高效、…

单片机裸机环境下临界区保护

目录 1、直接中断屏蔽法 2、嵌套计数优化法 3、BASEPRI寄存器应用 4、动态优先级调整策略 5、LDREX/STREX指令应用 6、位带别名区原子访问 7、上下文感知保护 8、中断延迟优化技术 在嵌入式系统开发中&#xff0c;临界区保护是确保系统可靠性的关键技术。本文以ARM Cor…