【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、使用帮助文档
打开帮助文档有三种方式,实际编程中使用哪种都可以:
- 光标放到要查询的类名/方法名上,直接按 F1
- Qt Creator 左侧边栏中直接用鼠标单击"帮助"按钮
三、结束语
今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。