【QT】基础入门学习

2024-09-09 04:36
文章标签 基础 学习 入门 qt

本文主要是介绍【QT】基础入门学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 浅析Qt应用程序的主函数
  • 使用qDebug()函数
  • 常用快捷键
  • Qt 编码风格
  • 信号槽连接模型
    • 实现方案
  • 信号和槽的工作机制
  • Qt对象树机制

浅析Qt应用程序的主函数

#include "mywindow.h"#include <QApplication>// 程序的入口
int main(int argc, char *argv[])
{// argc是命令行参数个数,argv是命令行参数// QApplication a(argc, argv),管理Qt程序的运行,和设置Qt应用程序,针对QWidget应用程序// QGuiApplication a(argc, argv),管理Qt程序的运行,和设置Qt应用程序,针对非QWidget应用程序,比如QQuick// QCoreApplication a(argc, argv),管理Qt程序的运行,和设置Qt应用程序,针对无界面的应用程序QApplication a(argc, argv);// MyWindow是我们自己定义的类,w是创建的对象MyWindow w;// w对象调用了show()方法w.show();// 事件循环,QEventLoop::exec(),等待鼠标或者键盘等其他的输入return a.exec();
}

使用qDebug()函数

如果使用qDebug()函数,要添加#include 头文件。
debug过程中比较常用的是qDebug()函数。对于Qt Creator,它是输出到应用程序输出栏。

#include "mywindow.h"
#include "ui_mywindow.h"
#include <QDebug>MyWindow::MyWindow(QWidget *parent): QMainWindow(parent), i(4) // i = 4;, ui(new Ui::MyWindow) // ui = new Ui::MyWindow;
{//i = 4;ui->setupUi(this);qDebug() << "构造函数执行了!" << endl;
}MyWindow::~MyWindow()
{qDebug() << "析构函数执行了!" << endl;delete ui;
}

常用快捷键

描述快捷键
新建文件或项目Ctrl + N
关闭当前窗口/关闭当前文件Ctrl + W
关闭所有文件Ctrl + Shift + W
关闭当前文件(windows)Ctrl + F4
运行Ctrl + R
返回上一级(返回),常用于跳转代码Alt + ←(方向左键)
进入下一级(前进),常用于跳转代码Alt + →(方向右键)
描述快捷键
自动排版对齐代码Ctrl + I
减小字体大小Ctrl + -(Ctrl + 鼠标滚轮向下)
增加字体大小Ctrl + +(Ctrl + 鼠标滚轮向上)
重置字体大小Ctrl + 0
折叠Ctrl + <
展开Ctrl + >
复制行Ctrl + Ins
复制到行下Ctrl + Alt + Down
复制到行上Ctrl + Alt + Up
在当前行上方插入新行Ctrl + Shift + Enter
在当前行下方插入新行Ctrl + Enter
查看剪切板历史Ctrl + Shift + V
剪切行Shift + Del
追加行Ctrl + J
向下移动当前行Ctrl + Shift + Down
向上移动当前行Ctrl + Shift + Up
切换函数声明/定义Ctrl + 鼠标左键/Shift + F2
编辑信号和槽F4
跳转至以}结尾的块Ctrl + }
跳转至以{开始的块Ctrl + {
打开类型层次窗口Ctrl + Shift + T

Qt 编码风格

Qt 编码风格

信号槽连接模型

在这里插入图片描述

实现方案

  1. 分别定义2个类,School类和Student类。
    在这里插入图片描述
  2. 源文件实现
    mainwindow.cpp 实现
 #include "mainwindow.h"
#include "ui_mainwindow.h"// 主窗口类的构造函数,接受一个 QWidget* 类型的父窗口指针
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{// 调用 setupUi 函数来设置主窗口的界面布局和用户界面元素ui->setupUi(this);// 创建一个 Student 类的对象,并将其指针存储在 student_object 变量中student_object = new Student;// 创建一个 School 类的对象,并将其指针存储在 school_object 变量中school_object = new School;// 建立信号与槽的连接,当 school_object(学校对象)发出 send_message 信号时,// student_object(学生对象)的 comeBackToClass 槽函数将被调用connect(school_object, SIGNAL(send_message()), student_object, SLOT(comeBackToClass()));// 手动发出 school_object 的 send_message 信号,触发与之连接的槽函数emit school_object->send_message();
}// 主窗口类的析构函数
MainWindow::~MainWindow()
{// 释放由 setupUi 函数分配的用户界面资源delete ui;
}

school.cpp 实现

#include "school.h"
#include <QObject>School::School(QObject *parent) : QObject(parent)
{qDebug("创建一个类型:School");
}

student.cpp 实现

#include "student.h"
#include <QDebug>Student::Student(QObject *parent) : QObject(parent)
{qDebug("创建一个类型:Student");
}void Student::comeBackToClass()
{qDebug("学生去上课");
}
  1. 头文件实现
    以下是对这段代码添加注释后的内容:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H// 引入 Qt 的主窗口类头文件
#include <QMainWindow>// 引入自定义的 School 类和 Student 类的头文件
#include "school.h"
#include "student.h"// 前向声明 School 类和 Student 类,避免循环包含头文件
class School;
class Student;// 开始 Qt 的命名空间
QT_BEGIN_NAMESPACE
// 命名空间 Ui 中定义了图形界面生成的类
namespace Ui { class MainWindow; }
// 结束 Qt 的命名空间
QT_END_NAMESPACE// 定义 MainWindow 类,继承自 QMainWindow
class MainWindow : public QMainWindow
{// 声明 Q_OBJECT 宏,用于支持 Qt 的信号与槽等特性Q_OBJECTpublic:// 主窗口类的构造函数,接受一个可选的父窗口指针MainWindow(QWidget *parent = nullptr);// 主窗口类的析构函数~MainWindow();private:// 指向由 Qt 的图形界面设计器生成的用户界面类的指针Ui::MainWindow *ui;// 指向 Student 类对象的指针Student *student_object;// 指向 School 类对象的指针School *school_object;
};
#endif // MAINWINDOW_H

#ifndef SCHOOL_H
#define SCHOOL_H

// 引入 Qt 的核心类头文件
#include <QObject>// 定义 School 类,继承自 QObject
class School : public QObject
{// 声明 Q_OBJECT 宏,用于支持 Qt 的信号与槽等特性Q_OBJECT
public:// School 类的构造函数,接受一个可选的父对象指针explicit School(QObject *parent = nullptr);// 信号声明部分signals: // 声明一个名为 send_message 的信号,只声明,不用定义void send_message();};#endif // SCHOOL_H
#ifndef STUDENT_H
#define STUDENT_H// 引入 Qt 的核心类头文件
#include <QObject>// 定义 Student 类,继承自 QObject
class Student : public QObject
{// 声明 Q_OBJECT 宏,用于支持 Qt 的信号与槽等特性Q_OBJECT
public:// Student 类的构造函数,接受一个可选的父对象指针explicit Student(QObject *parent = nullptr);// 信号声明部分,这里暂未声明任何信号public slots:// 声明一个名为 comeBackToClass 的槽函数void comeBackToClass(void);
};#endif // STUDENT_H

最终实现效果
在这里插入图片描述

信号和槽的工作机制

一、信号的发出
当某个特定的事件发生在一个对象(发送者)中时,这个对象可以发出一个信号。例如,当用户点击一个按钮时,按钮对象可以发出一个 “clicked” 信号。这个信号的发出通常是通过使用emit关键字来实现的。
信号只是一个声明,它不需要实现具体的代码逻辑。信号可以携带参数,以便在发出信号时传递一些额外的信息。
二、槽的定义和连接
槽是一个普通的成员函数,可以在任何 Qt 对象中定义。槽函数可以有不同的参数和返回值类型,具体取决于需要处理的信号。例如,一个槽函数可以用来处理按钮点击事件,执行一些特定的操作,如打开一个新窗口、更新数据等。
为了建立信号与槽的连接,可以使用connect函数。这个函数接受发送者对象、发送者发出的信号、接收者对象和接收者的槽函数作为参数。例如:connect(senderObject, SIGNAL(signalName()), receiverObject, SLOT(slotName()));。这样,当发送者发出指定的信号时,接收者的槽函数就会被调用。
三、信号与槽的调用过程
当发送者发出信号时,Qt 的元对象系统会自动查找所有与这个信号连接的槽函数,并将信号携带的参数传递给槽函数。
槽函数会在接收者对象的上下文中被调用,就像普通的成员函数一样。如果有多个接收者连接到同一个信号,那么这些接收者的槽函数会按照连接的顺序依次被调用。
信号与槽的连接是动态的,可以在运行时建立和断开。这使得程序可以根据不同的情况灵活地调整对象之间的通信关系。
总之,信号与槽机制提供了一种松耦合的通信方式,使得不同的对象可以在不了解对方内部实现的情况下进行交互。这种机制使得 Qt 程序的设计更加灵活、可维护和可扩展。

QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));//connect() 是 QObject 类的一个静态函数,而 QObject 是所有 Qt 类的基类,在实际调用时可以忽略前面的限定符,

在这里插入图片描述

Qt对象树机制

Qt 的对象树机制是一种自动管理内存的机制,它可以有效地避免内存泄漏问题,同时也方便了对象的管理和组织。

在这里插入图片描述
假设我们要收拾桌子,我们把桌子当作父对象,桌子上面的饭菜当作是子对象,我们收拾桌子之前,肯定是先收拾饭菜,然后再收拾桌子。我们把收拾桌子比作对象析构的过程:父对象析构的时候,会先析构所有的子对象

一、机制原理

在 Qt 中,当创建一个 QObject 对象时,可以将其作为另一个 QObject 对象的子对象。例如:

 // 1.通过构造函数传参
QObject *parentObject = new QObject();
QObject *childObject = new QObject(parentObject);// 2.通过setParent()方法
childObject ->setParent(parentObject);

这里,childObject被设置为parentObject的子对象。当父对象被销毁时,它的所有子对象也会被自动销毁。这是因为 QObject 的析构函数会遍历其所有子对象,并依次销毁它们。

二、作用和优势

  1. 内存管理

    • 通过对象树机制,无需手动跟踪和释放每个对象的内存,大大减少了内存泄漏的风险。
    • 当一个对象不再需要时,只需销毁它的父对象,就可以自动清理其所有子对象,简化了内存管理的过程。
  2. 对象组织

    • 对象树提供了一种清晰的层次结构,方便对相关对象进行组织和管理。
    • 可以通过遍历对象树来快速访问特定的对象或执行特定的操作。
  3. 信号与槽机制的便利

    • 在对象树中,信号可以自动传播到父对象和子对象,使得事件的传递更加方便和高效。
    • 可以利用对象树的结构来设计和实现复杂的交互逻辑。

三、注意事项

  1. 确保正确设置父对象:在创建对象时,务必正确设置父对象,以确保对象树的完整性。如果父对象在子对象之前被销毁,可能会导致未定义的行为。

  2. 避免循环引用:虽然对象树机制可以自动管理内存,但如果存在循环引用,可能会导致内存泄漏。例如,如果两个对象相互引用对方作为父对象或子对象,那么它们将无法被正确销毁。

  3. 手动删除对象:在某些情况下,可能需要手动删除对象。例如,如果一个对象不再需要,但它的父对象仍然存在,那么可以使用delete关键字手动删除该对象。但在手动删除对象时,需要注意避免破坏对象树的结构。

总之,Qt 的对象树机制是一种强大的内存管理和对象组织工具,可以提高开发效率,减少内存泄漏的风险。在使用 Qt 进行开发时,应充分利用对象树机制,并注意遵循其使用规则,以确保程序的稳定性和可靠性。

这篇关于【QT】基础入门学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1150178

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学