QT基础知识

QT概述

QT是一个可以跨平台的C++图形用户界面应用程序框架。它为应用程序开发者提供建立艺术级图形界面所需的所有功能。它是完全面向对象的,很容易扩展,并且允许真正的组件编程。

微软的MFC不支持跨平台,QT可以在任意操作系统中使用。
MFC在VS中建立控制台应用程序,只能做一些点阵式的小东西,局限性大。

下载与安装

QTCreater下载地址.

VS中编写QT

要在VS中编写QT程序需要安装插件。

简单的QT程序

  • 欢迎界面:新建项目 打开项目
  • 编辑界面:写项目
  • 设计界面:控件操作
  • Debug:调试
  • 帮助界面:帮助文档,查询所需功能

创建QT工程

  1. 打开 QT Creater,点击New Project,弹出对话框。
  2. 弹出New Project对话框,选择Qt Widgets Application,点击Choose
    在这里插入图片描述
  3. 设置项目名称和路径。项目名称和路径都不能有空格和中文。
  4. 构建编译套件。
    在这里插入图片描述
    • QT支持一些安卓类型的开发,如果选择安卓版本,下面会有安卓的配置环境
    • QTCreater版本不同,代码会有区别。可以在构建套件中配置来适配不同版本。
  5. 类信息。在创建QT项目的时候都会默认创建一个类,这个类就是主窗口的类。主窗口的基类有三种选择:QWidget是父类,是最简单的类,相当于空窗口,里面什么也没有;QMainWindow继承QWidget类,它多了菜单栏、工具栏、状态栏;QDialog类也继承QWidget类,用于对话框。新建QWidget类,会自动生成头文件、源文件和界面文件。创建界面选项如果勾选在设计栏可以直接拖拽控件操作。初学的时候不要勾选,用代码来写控件。
    在这里插入图片描述
  6. 汇总。QT开发往往不是一个人在写,而是多人完成。这个时候就需要用到一些版本控制系统(SVN VSS GIT),在这里添加。
    在这里插入图片描述
  7. 点击完成,QT项目就建好了。
    在这里插入图片描述

main函数

#include "mywidget.h"
#include <QApplication> //包含一个应用程序类的头文件
//程序入口 argc命令行变量的数量 argv命令行变量的数组
int main(int argc, char *argv[])
{
	//创建应用程序对象,这个对象在QT中应用程序中有且仅有一个
    QApplication a(argc, argv); 
    //窗口对象 QWidget->(派生)myWidget
    myWidget w;
    //窗口对象默认不会显示,必须调用show方法显示窗口
    w.show();

	//让应用程序对象a进入消息循环,等待对用户输入进行响应
	//在exec()中,QT接受并处理用户和系统事件并把它们传递给对应的窗口部件
    return a.exec();
}
  • QApplication是应用程序类,QT系统提供的标准类声明头文件没有.h后缀。这个类:
    • 管理图形用户界面应用程序的控制流和主要设置
    • 是QT的整个后台管理的命脉。它包含主事件循环,在其中来自窗口系统和其他资源的所有事件处理和调度。它也处理应用程序的初始化和结束,并提供对话管理。
    • 对于任意QT应用程序,都存在一个且仅有一个QApplication对象。

.pro工程文件

//QT包含的模块。core是核心模块,gui是用户图形模块
QT       += core gui  

//大于Qt4的版本才包含widgets模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

//指定生成的.exe应用程序的名称
TARGET = 01_FirstProject
//模板类型,选择app应用程序模板
TEMPLATE = app

//定义编译选项。QT_DEPRECATED_WARNINGS表示当Qt的某些功能被标记为过时的,那么编译器会发出警告。
DEFINES += QT_DEPRECATED_WARNINGS

//指定源文件和头文件
SOURCES += \
        main.cpp \
        mywidget.cpp
HEADERS += \
        mywidget.h
  • Qt包含的基本模块如下:Qt Widgets模块是Qt5版本以上才有。Core和GUI是默认包含的模块
    在这里插入图片描述
  • 如果点击.exe文件显示库文件丢失不能运行,需要添加环境变量。教程
  • .pro是工程文件,它是qmake自动生成的用于生成makefile的配置文件。如果不必要尽量不要在里面写东西。要注意这里的注释是用‘#’表示的
  • 模板变量告诉qmake为这个应用程序生成哪种makefile,以下是可供选择的模板变量:
    1. app:建立应用程序makefile。这是默认的。
    2. lib:建立一个库的makefile。
    3. vcapp:建立一个应用程序的VisualStudio项目文件
    4. vclib:建立一个库的VisualStudio项目文件。
    5. subdirs:特殊的模板,可以创建一个能够进入特定目录并且为一个项目文件生成makefile并为它调用make

头文件

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>

class myWidget : public QWidget
{
    Q_OBJECT //一个宏定义,允许类中使用信号和槽的机制

public:
    myWidget(QWidget *parent = 0); //构造函数
    ~myWidget(); //析构函数
};

#endif // MYWIDGET_H

.cpp文件和开发注意事项

#include "mywidget.h"

myWidget::myWidget(QWidget *parent)
    : QWidget(parent)
{
}

myWidget::~myWidget()
{

}

命名规范

  • 类名:首字母大写,单词和单词之间首字母大写
  • 函数名和变量名称:首字母小写,单词和单词之间首字母大写

快捷键

  • 注释:Ctrl+/
  • 运行:Ctrl+R
  • 编译:Ctrl+B
  • 查找关键字:Ctrl+F
  • 整行移动:Ctrl+shift+⬆/⬇
  • 帮助文档:F1
  • 自动对齐:Ctrl+I
  • 同名之间的.h和.cpp切换:F4

按钮QPushButton

按钮是最基础的控件。使用时要包含头文件。
按钮的父类是QAbstractButton,再往上一层的父类是QWidget,即窗口类。
窗口类在显示的时候一般用show函数,但是show函数所显示的窗口默认在顶层,如果用show函数来创建控件,那么控件将脱离主窗口显示在外边。

#include "mywidget.h"
#include <QPushButton>  //按钮的头文件

myWidget::myWidget(QWidget *parent)
    : QWidget(parent)
{
    //创建一个按钮
    QPushButton * btn = new QPushButton;

    //按钮继承自QWidget,需要显示按钮
    //btn->show();   //以顶层的方式显示控件,当用show函数时按钮在窗口的顶层,不在主窗口中,所以我门不用show函数来显示控件。
    btn->setParent(this); //设置父窗体,btn按钮对象将依附于myWidget窗口中

    //显示文本
    btn->setText("第一个按钮");
}

myWidget::~myWidget()
{

}

创建按钮也可以直接调用默认构造函数。但是这种方法有个弊端,即系统会按照这个控件的大小来创建窗口。我们可能需要重置窗口大小。

QPushButton * btn2 = new QPushButton("按钮",this);
//重置窗口大小
resize(600,400);  //宽×高
//按钮也可以重置大小
btn2->resize(50,50);

后创建的控件会覆盖之前的控件,如果我们创建了很多按钮控件,那么只会显示最后一个按钮,其余都被覆盖了。我们需要移动控件:

//移动控件
btn->move(100,100); //传入坐标

其他窗口设置

#include <QPushButton>  //按钮的头文件

myWidget::myWidget(QWidget *parent)
    : QWidget(parent)
{
    //设置窗口标题
    setWindowTitle("第一个窗口");
    
	//设置固定窗口大小
    setFixedSize(600,400);
    //setFixedWeight()
    //setFixedHeight()
}

对象模型(对象树)

QT的对象树就是QT的内存回收机制。
在上面创建的按钮,我们都是用C++语言new出来的,创建出的按钮对象存在堆区。按照内存分配,堆区的对象需要我们手动删除。但是在QT中即使我们不写delete操作,我们创建的按钮对象也会释放掉。这就是对象树的概念。
我们创建类对象时,这个类往往具有其父类。在QT中,所有对象有一个共同的基类:QObject类。
在QT中创建对象会提供一个parent对象指针。当我们创建QObject对象的时候,会看到QObject的构造函数接收一个QObject指针作为参数,这个参数就是parent,即父对象指针。

#include "mywidget.h"
myWidget::myWidget(QWidget *parent)   //构造函数,接收一个parent指针
    : QWidget(parent)
{
	QPushButton * btn = new QPushButton;
	btn->setParent(this);  //设置到对象树中
}

myWidget::~myWidget()
{
}

在创建QObject对象时,可以提供一个其父对象,我们创建的这个QObject对象会自动添加到其父对象的children()列表中。当其父对象析构的时候,这个列表中的所有对象也会被析构。局部对象的析构顺序按照其创建顺序的相反过程。这就是QT中的对象树。
注意析构函数的顺序和构造相反,但是如果我们在验证执行顺序的时候喜欢让析构函数打印信息,但是往往打印的顺序和析构释放对象的顺序正好相反(即打印的顺序和构造的顺序相同)。这里是因为在执行析构函数的时候,系统先进行打印操作,打印完之后不结束析构释放对象,而是寻找这个类是否有子对象;若有子对象则进入子对象析构继续上述操作,如果没有子对象则释放对象,返回父类析构。
QWidget是能够在屏幕上显示的一切组件的父类,QWidget继承自QObject,因此也具有这种对象树的关系。一个孩子自动的成为父组件的一个子组件。
引入对象树的概念,在一定程度上简化了内存回收机制,当一个QObject对象在堆区上创建对象时,QT会同时为其创建一个对象树。任何对象树中的QObject对象delete的时候,如果这个对象有parent,则自动将其从parent的children()列表中删除;如果有孩子,则自动delete每一个孩子。QT保证没有一个对象会被delete两次,这是由析构的顺序决定的。

坐标系

QT中的坐标原点(0,0),在左上角。X向右增加,Y向下增加。
对于嵌套的窗口,其坐标是相对其父窗口来说的。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值