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

news2025/5/10 10:44:45

文章目录

  • 使用编辑框来完成 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_OBJECT

public:
    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_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    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);
    // 老样子,创建对象,在connect
    myButton = 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.coloradmin.cn/o/2372237.html

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

相关文章

关于大数据的基础知识(二)——国内大数据产业链分布结构

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于大数据的基础知识&#xff08;二&a…

Winform(11.案例讲解1)

今天写两个案例,用于更好的理解控件的使用 在写之前先写一个类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _1.案例讲解 { internal class Student { public string …

电机密集型工厂环境下的无线通信技术选型与优化策略

点击下面图片带您领略全新的嵌入式学习路线 &#x1f525;爆款热榜 88万阅读 1.6万收藏 在电机、变频器、电焊机等强电磁干扰源遍布的工业环境中&#xff0c;无线通信系统的可靠性面临严峻挑战。本文从抗干扰能力、传输稳定性、实时性需求三大核心维度出发&#xff0c;结合工…

一文了解氨基酸的分类、代谢和应用

氨基酸&#xff08;Amino acids&#xff09;是在分子中含有氨基和羧基的一类化合物。氨基酸是生命的基石&#xff0c;人类所有的疾病与健康状况都与氨基酸有直接或间接的关系。氨基酸失衡可引起肝硬化、神经系统感染性疾病、糖尿病、免疫性疾病、心血管疾病、肾病、肿瘤等各类疾…

系统学习算法:动态规划(斐波那契+路径问题)

题目一&#xff1a; 思路&#xff1a; 作为动态规划的第一道题&#xff0c;这个题很有代表性且很简单&#xff0c;适合入门 先理解题意&#xff0c;很简单&#xff0c;就是斐波那契数列的加强版&#xff0c;从前两个数变为前三个数 算法原理&#xff1a; 这五步可以说是所有…

JAVA房屋租售管理系统房屋出租出售平台房屋销售房屋租赁房屋交易信息管理源码

一、源码描述 这是一套房屋租售管理源码&#xff0c;基于SpringBootVue框架&#xff0c;后端采用JAVA开发&#xff0c;源码功能完善&#xff0c;涵盖了房屋租赁、房屋销售、房屋交易等业务。 二、源码截图

掌握Multi-Agent实践(三):ReAct Agent集成Bing和Google搜索功能,采用推理与执行交替策略,增强处理复杂任务能力

一个普遍的现象是,大模型通常会根据给定的提示直接生成回复。对于一些简单的任务,大模型或许能够较好地应对。然而,当我们面对更加复杂的任务时,往往希望大模型能够表现得更加“智能”,具备适应多样场景和解决复杂问题的能力。为此,AgentScope 提供了内置的 ReAct 智能体…

Bearer Token的神秘面纱:深入解析HTTP认证头的设计哲学

为何有些Token会带Bearer&#xff1f; 在接口测试与开发中&#xff0c;我们经常会遇到这样的请求头&#xff1a; Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... 这个神秘的"Bearer"前缀从何而来&#xff1f;为何不直接使用Authorization: Token..…

【国产化】在银河麒麟ARM环境下离线安装docker

1、前言 采用离线安装的方式。 关于离线安装的方式官网有介绍&#xff0c;但是说的很简单&#xff0c;网址&#xff1a;Binaries | Docker Docs 官网介绍的有几种主流linux系统的安装方式&#xff0c;但是没有kylin的&#xff0c;所以在此记录一下。 在安装过程中也遇到了些…

java volatile关键字

volatile 是 Java 中用于保证多线程环境下变量可见性和禁止指令重排序的关键字。 普通变量不加volatile修饰有可见性问题&#xff0c;即有线程修改该变量值&#xff0c;其他线程无法立即感知该变量值修改了。代码&#xff1a; private static int intVal 0; // 普通变量未加 …

Vibe Coding: 优点与缺点

如果你最近在开发圈子里,你很可能听说过这个新趋势"vibe coding"(氛围编程)。 我只能说我对此感受复杂。以下是原因。 优势 在构建新项目时,靠着氛围编程达到成功感觉很自由!但对于遗留代码来说情况就不同了,尽管也不是不可能。 实时反馈和快速迭代 Cursor(…

技术分享 | 如何在2k0300(LoongArch架构)处理器上跑通qt开发流程

近期迅为售后团队反馈&#xff0c;许多用户咨询&#xff1a;2K0300处理器采用了LA264处理器核&#xff0c;若要在该处理器上运行Qt程序&#xff0c;由于架构发生了变化&#xff0c;其使用方法是否仍与ARM平台保持一致&#xff1f; 单纯回答‘一致’或‘不一致’缺乏说服力&…

基于卷积神经网络和Pyqt5的猫狗识别小程序

任务描述 猫狗分类任务&#xff08;Dogs vs Cats&#xff09;是Kaggle平台在2013年举办的一个经典计算机视觉竞赛。官方给出的Kaggle Dogs vs Cats 数据集中包括由12500张猫咪图片和12500张狗狗图片组成的训练集&#xff0c;12500张未标记照片组成的测试集。选手需要在规定时间…

解锁健康养生新境界

在追求高品质生活的当下&#xff0c;健康养生早已超越 “治未病” 的传统认知&#xff0c;成为贯穿全生命周期的生活艺术。它如同精密的交响乐&#xff0c;需饮食、运动、心理与生活习惯多维度协奏&#xff0c;方能奏响生命的强音。 饮食养生讲究 “顺时、适性”。遵循二十四节…

基于OpenCV的人脸识别:EigenFaces算法

文章目录 引言一、概述二、代码解析1. 准备工作2. 加载训练图像3. 设置标签4. 准备测试图像5. 创建和训练识别器6. 进行预测7. 显示结果 三、代码要点总结 引言 人脸识别是计算机视觉领域的一个重要应用&#xff0c;今天我将通过一个实际案例来展示如何使用OpenCV中的EigenFac…

【深度学习新浪潮】智能追焦技术全解析:从算法到设备应用

一、智能追焦技术概述 智能追焦是基于人工智能和自动化技术的对焦功能,通过深度学习算法识别并持续跟踪移动物体(如人、动物、运动器械等),实时调整焦距以保持主体清晰,显著提升动态场景拍摄成功率。其核心优势包括: 精准性:AI 算法优化复杂运动轨迹追踪(如不规则移动…

网络研讨会开发注册中, 5月15日特励达力科,“了解以太网”

在线研讨会主题 Understanding Ethernet - from basics to testing & optimization 了解以太网 - 从基础知识到测试和优化 注册链接# https://register.gotowebinar.com/register/2823468241337063262 时间 北京时间 2025 年 5 月 15 日 星期四 下午 3:30 - 4:30 适宜…

STL?vector!!!

一、前言 之前我们借助手撕string加深了类和对象相关知识&#xff0c;今天我们将一起手撕一个vector&#xff0c;继续深化类和对象、动态内存管理、模板的相关知识 二、vector相关的前置知识 1、什么是vector&#xff1f; vector是一个STL库中提供的类模板&#xff0c;它是存储…

从黔西游船侧翻事件看极端天气预警的科技防线——疾风气象大模型如何实现精准防御?

近日,贵州省黔西市一起载人游船侧翻事故令人痛心。调查显示,事发时当地突遇强风暴雨,水面突发巨浪导致船只失控。这一事件再次凸显:在极端天气频发的时代,传统“经验式防灾”已不足够,唯有依靠智能化的气象预警技术,才能筑牢安全底线。 极端天气预警的痛点:为什么传统方…

FastChat部署大模型

一、前提条件 1、系统环境&#xff08;使用的 autodl 算力平台&#xff09; 2、安装相关库 安装 modescope pip3 install -U modelscope # 或使用下方命令 # pip3 install -U modelscope -i https://mirror.sjtu.edu.cn/pypi/web/simple安装 fastchat git clone https://gi…