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

【QT】编写 QT Hello World程序 对象树 Qt 编程事项

> 作者:დ旧言~
> 座右铭:松树千年终是朽,槿花一日自为荣。

> 目标:编写 QT 中的 Hello world。

> 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安!

> 专栏选自:QT从基础到入门_დ旧言~的博客-CSDN博客

> 望小伙伴们点赞👍收藏✨加关注哟💕💕

一、编写第一个 QT 程序


1.1、使用 标签 实现 

① 纯代码形式实现:

我们点击 widget.cpp 里面,会有一个 widget 的构造函数和析构函数,我们一般使用代码进行编辑界面的时候,一般都是在 widget 的构造函数中实现,因为在  main 函数中调用了 widget 类之后就直接 show了,所以卸载构造函数中的时候,一旦执行到了 show 就一定可以显示出设计的界面。

代码呈现:

#include "widget.h" // 创建生成时的文件
#include "ui_widget.h"
#include <QLabel>  // 包含标签的头文件

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this); // 将form file生成的界面和我们当前的widget进行关联起来
    // 创建对象的两种方法
    // QLabel label; // 在栈上创建
    QLabel* label = new QLabel(this); // 在堆上创建,推荐这种方法,还要传递 一个 this,给当前这个 lable 对象指定 父对象

    // 1. 设置标签内容
    label->setText((QString)("显式 Hello world"));
    label->setText("隐式 Hello World"); // QString 也提供了 C 风格字符串作为参数的构造函数来不显示构造 QString
    // 注意:由于QString 对应的头文件,已经被很多 Qt 内置的其他类给间接包含了.因此一般不需要显式包含 QString 头文件
    // 这里虽然有两次 setText,但是下面内容会覆盖上面内容

    // 2. 设置窗口大小
    setFixedSize(500, 400);

    // 3. 设置字体大小
    QFont font("楷体", 16);
    label->setFont(font);

    // 4. 设置标签内容显式位置
    label->move(200, 150);

    // 5. 设计标签字体颜色
    label->setStyleSheet("color:blue");
}

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

运行结果:

② 图形化界面:

创建好一个项目后,我们可以点击 widget.ui 进入图形化界面设计,可以直接通过拖拽的方式进行添加:

拖拽 "标签" 至 UI 设计界面中,并双击修改标签内容:

1.2、使用 按钮 实现


1.2.1、图形化界面实现

① 双击:"widget.ui" 文件:

② 拖拽控件至 ui 界面窗口并修改内容:

③ 构建并运行,效果如下所示:

  • 这里的按钮的确可以点击,但是却没有任何反应,这个就设计到我们后面学的信号槽知识,后面会说的。

  • QT 的信号槽机制:本质上就是给按钮的点击操作,关联上一个处理函数,当用户点击的时候,就会执行这个处理函数。

1.2.2、纯代码形式实现

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);
    void handleClick();
    ~Widget();
 
private:
    Ui::Widget *ui;
 
    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);
    myButton = new QPushButton(this);
    myButton->setText("Hello World");
    connect(myButton, &QPushButton::clicked, this, &Widget::handleClick);  // 访问到 form file(ui 文件)中创建的控件
}
 
Widget::~Widget()
{
    delete ui;
}
 
void Widget::handleClick()
{
    if(myButton->text() == QString("Hello World")){
        myButton->setText("Hello IsLand");
    }else{
        myButton->setText("Hello World");
    }
}

效果如下:

两个版本比较:

  • 图形化实现:此时按钮对象不需要咱们自己 new。new 对象的操作已经是被 Qt 自动生成了而且这个按钮对象,已经作为 ui 对象里的一个成员变量了,也无需作为 Widget 的成员。
  • 纯代码实现:按钮对象是咱们自己 new 的,为了保证其他函数中能够访问到这个变量,就需要把按钮对象,设定为 Widget 类的成员变量。

实际开发中,是通过代码的方式构造界面为主,还是通过图形化界面的方式构造界面为主:

  • 这两种都很主要,难分主次!!
  • 如果你当前程序界面,界面内容是比较固定的,此时就会以 图形化 的方式来构造界面
  • 但是如果你的程序界面,经常要动态变化,此时就会以 代码 的方式来构造界面
  • 反正这两种方式哪种方便用哪个,也可以配合来使用

1.3、使用 编辑框 实现

  • 单行编辑框: QLineEdit
  • 多行编辑框: QTextEdit

图形化界面实现:

二、认识对象模型(对象树)


2.1、什么是对象树

QObject  是以对象树的形式组织起来的:

  • 当创建一个 QObject 对象时,会看到 QObject 的构造函数接收一个 QObject 指针作为参数,这个参数就是 parent,也就是父对象指针。
  • 这相当于,在创建 QObject 对象时,可以提供一个其父对象,我们创建的这个 QObject 对象会自动添加到其父对象的 children()列表。
  • 当父对象析构的时候,这个列表中的所有对象也会被析构。(注意,这里的父对象并不是继承意义上的父类!)

Qwidget 是能够在屏幕上显示的一切组件的父类:

  • Qwidget 继承自 QObject,因此也继承了这种对象树关系。一个孩子自动地成为父组件的-个子组件。因此,它会显示在父组件的坐标系统中,被父组件的边界剪裁。例如,当用户关闭一个对话框的时候,应用程序将其删除,那么,我们希望属于这个对话框的按钮、图标等应该(-起被删除。事实就是如此,因为这些都是对话框的子组件。
  • 当然,我们也可以自己删除子对象,它们会自动从其父对象列表中删除。比如,当我们删除了个工具栏时,其所在的主窗口会自动将该工具栏从其子对象列表中删除,并且自动调整屏幕显示。

Qt 引入对象树的概念,在一定程度上解决了内存问题:

  • 当一个 QObject 对象在堆上创建的时候,Qt 会同时为其创建一个对象树。不过,对象树中对象的顺序是没有定义的。这意味着,销毁这些对象的顺序也是未定义的。
  • 任何对象树中的 QObject 对象 delete 的时候,如果这个对象有 parent,则自动将其从 parent的children() 列表中删除;如果有孩子,则自动 delete 每一个孩子。Qt 保证没有 QObject 会被delete 两次,这是由析构顺序决定的。

Qt 对象树如下:

三、Qt 编程注意事项


3.1、Qt 中的命名事项

  • 类名:首字母大写,单词和单词之间首字母大写;
  • 函数名及变量名:首字母小写,单词和单词之间首字母大写
  • 起的名字要有描述性,不要使用 abc, xyz 这种比较无规律的名字来描述
  • 如果名字比较长,由多个单词构成的,就需要使用适当的方式来进行区分不同单词
  • 一般可以采用 蛇形命名法 或者 驼峰命名法

3.2、Qt Creator 中的快捷键

其里面内置 Vim 插件,因此我们也可以按照使用 Vim 操作来使用:

  • 注释:ctrl+/
  • 运行:ctrl+R
  • 编译:ctrl+B
  • 字体缩放:ctrl+鼠标滑轮
  • 查找:ctrl+F
  • 整行移动:ctrl+shift+↑/↓
  • 帮助文档:F1
  • 自动对齐:ctrl+i
  • 同名之间的.h和.cpp 的切换:F4
  • 生成函数声明的对应定义:alt+enter
  • 跳转到控件定义: 鼠标左键 + ctrl,返回就是:alt + <-

3.3、使用帮助文档

打开帮助文档有三种方式,实际编程中使用哪种都可以:

  1. 光标放到要查询的类名/方法名上,直接按 F1
  2. Qt Creator 左侧边栏中直接用鼠标单击"帮助"按钮

三、结束语

今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。


http://www.kler.cn/a/592064.html

相关文章:

  • Docker 镜像优化:如何避免重复安装软件,加速服务的构建与部署
  • turfijs合并相邻或者相交多边形
  • 华为手机新品将采用新屏幕形态,3月20日揭晓谜底
  • Qt | 网络编程+面试题
  • Linux主机持久化技术
  • Qwen2.5-VL 开源视觉大模型,模型体验、下载、推理、微调、部署实战
  • VS Code + Git 分支操作指南(附流程图)
  • 解决 HTTP 请求中的编码问题:从乱码到正确传输
  • Redis 使用入门与进阶指南
  • 《算法笔记》9.2小节——数据结构专题(2)->二叉树的遍历 问题 A: 复原二叉树(同问题 C: 二叉树遍历)
  • 【MySQL数据库】多表查询(笛卡尔积现象,联合查询、内连接、左外连接、右外连接、子查询)-通过练习快速掌握法
  • 【redis】渐进式遍历(scan)和数据库数据库管理
  • STL中的哈希表(unordered_map和unordered_set内部使用的数据结构)
  • 华为IPD变革20年历程
  • JMeter 参数化工作原理说明
  • 【WEB APIs】正则表达式
  • 25. K 个一组翻转链表(C++)
  • Java面试黄金宝典1
  • 数据库:一文掌握 MongoDB 的各种指令(MongoDB指令备忘)
  • linux 出现网卡 down 没起来 怎么办 ? 已解决