QT 入门

QT概述

QT是一个跨平台C++图形用户界面应用程序框架,是面向对象的。
划重点:!!!

  1. 跨平台
  2. 语言:C++
  3. 图形用户界面应用程序框架(我的理解,就是可视化工具)

创建QT项目

  1. 打开 QT Creator(不得不说,之前装过几次QT,也不知道各个组件是干嘛的,一打开文件夹看到一群图标,就人傻了),所以,再次提醒我自己,创建项目用的是QT Creator!!!
    在这里插入图片描述
  2. 打开之后长这样在这里插入图片描述
  3. 创建项目
    在这里插入图片描述
    按照1,2,3的顺序点击(这里,各种项目的类型我还没搞明白,只能先记住了…)
    在这里插入图片描述
    先对新创建的项目命名,然后选择项目存储的路径,最后,点击下一步
    在这里插入图片描述
    这一步,选择的是编译套件,(QT会自动帮你选择)点击下一步
    在这里插入图片描述
    这一步,系统默认添加一个继承子自CMainWindow的类,在这里可以修改类的名字和基类
    连续两次,点击下一步,既可创建出一个QT程序
    在这里插入图片描述
    创建完之后,会弹出这样的页面。
    在这里插入图片描述

在这里插入图片描述
QMainWindow 是主窗口类,主窗口具有菜单栏、工具栏和状态栏,类似于一般的应用程序的主窗口
QWidget是所有具有可视化界面类的基类,选择QWidget创建的界面对各种界面组件都可以支持
QDialog是对话框类,可建立一个基于对话框的界面

点开你刚刚创建的文件夹,或者是,你存放项目的文件夹,都能看到这几个文件,下面解释一下它们
在这里插入图片描述
在这里插入图片描述

.pro文件

.pro就是工程文件(project),他是qmake自动生成的用于生产makefile的配置文件。
一般情况下,.pro文件的文件格式
在这里插入图片描述
模板变量:TEMPLATE,这个玩意儿告诉qmake为这个应用程序生成哪种makefile
在这里插入图片描述

Headers 分组

该节点下是项目内所有的头文件(.h)

Sources 分组

该项目内的所有C++源文件(.cpp),如上图,mainwindow.cpp是主窗口类的实现文件,也是程序的入口

Froms 分组

该节点下是项目内的所有界面文件(.ui)
mainwindow.ui就是主窗口的界面文件。
界面文件是文本文件,使用XML语言描述界面的组成
在这里插入图片描述

运行一个QT项目

说起这个,就又得提我的傻逼行为,生成的一堆文件中,我不知道运行哪个,搁那儿乱运行一通…
强调,运行的是main.cpp文件!!!
打开,可以看到一个最最进本的QT项目,生成一个空的页面
请添加图片描述
点击运行,可以看到:
在这里插入图片描述

注意事项

  1. QT头文件没有.h后缀
  2. QT一个类对应一个头文件,类名就是头文件名
  3. QApplication应用程序类
    3.1 管理图形用户界面应用程序的控制流和主要设置。
    3.2 是QT的整个后台管理的命脉它包含主事件循环,在其中来自窗口系统和其他资源的所有事件处理和调度。它也处理应用程序的初始化和结束,并且提供对话管理
    3.3 对于任何一个使用QT的图形用户界面应用程序,都正好存在一个QApplication对象,而不论这个应用程序在同一时间内是不是有0,1,2或更多个窗口。
  4. .exec()
    程序进入消息循环,等待对用户输入进行响应。这里main()把控制权转交给QT,QT完成事件处理工作,当应用程序推出的时候exec()的值就会返回。在exec()中,QT接受并处理用户和系统的事件并且把它们传递给适当的窗口部件

信号和槽

信号槽,就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal),这种发出是没有目的的。
如果有对象对这个信号感兴趣,就会用连接函数(connect),也就是说,将想要处理的信号和自己的一个函数(槽(slot))绑定来处理这个信号
当信号发出时,被连接的槽函数会自动被回调。
看一个栗子:

#include<QApplication>
#include<QPushButton>

int main(int argc,char *argv[])
{
    
    
    QApplication app(argc,argv);
    QPushButton button("Quit");
    QObject::connect(&button,&QPushButton::clicked,&app,&QApplication::quit);
    button.show();
    return app.exec();
}

运行结果:
在这里插入图片描述
点击Quit,程序退出
connect()函数最常用的一般形式:

connect(sender,signal,receiver,slot);

参数:

  1. sender: 发出信号的对象
  2. signal: 发送对象发出的信号
  3. receiver: 接收信号的对象
  4. slot: 接收对象在接收到信号之后所需要调用的函数

信号槽要求信号和槽的参数一致,所谓一致,是参数类型一致。如果不一致,允许的情况是,槽函数的参数可以比信号的少,即便如此,槽函数存在的那
参数的顺序也必须和信号的前面几个一致起来。这是因为,你可以在槽函数中选择忽略信号传来的数据(也就是槽函数的参数比信号的少),但是不能说信号根本没有这个数据,你就要在槽函数中使用(就是槽函数的参数比信号的多,这是不允许的)。

自定义信号槽

connect()函数可以让我们连接系统自带的信号和槽。QT同时允许我们自己设计的信号和槽。
(就像C++一样,允许我们直接调用系统内置的库函数,但同时也允许我们自定义函数)
实现一个报纸和订阅者的栗子:
有一个报纸类Newspaper,有一个订阅者类Subscriber。Subscriber可以订阅Newspaper。
这样,当Newspaper有了新的内容的时候,Subscriber可以立即得到通知。

#include <QObject>
// newspaper.h //
class Newspaper : public QObject
{
    
    
 Q_OBJECT
public:
 Newspaper(const QString & name) :
 m_name(name)
 {
    
    
 }
 void send()
 {
    
    
 emit newPaper(m_name);
 }
signals:
 void newPaper(const QString &name);
private:
 QString m_name;
};
/*newspaper类,继承QObject类。只有继承了QObject类的类,才具有信号槽的能力*/

首先是,newspaper类,继承QObject类。只有继承了QObject类的类,才具有信号槽的能力

猜你喜欢

转载自blog.csdn.net/qq_52109814/article/details/121875392