【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 左侧边栏中直接用鼠标单击"帮助"按钮

三、结束语

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

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值