QT - 介绍

QT的概述:

  1. QT是一个跨平台的 C++ 图形用户界面(GUI)应用程序开发框架,它不仅提供了创建 GUI 界面的各种组件(如窗口、按钮、文本框等),还包含了丰富的非 GUI 功能模块,支持从桌面应用到嵌入式系统、移动设备的多平台开发,是现代软件开发中极具灵活性和扩展性的工具集。

  2. 图形用户界面 :(GUI)

    1. 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。
    2. 图形用户界面是一种人与计算机通信的界面显示格式,允许用户使用鼠标等输入设备操纵屏幕上的图标或菜单选项,以选择命令、调用文件、启动程序或执行其它一些日常任务。
  3. Qt 的 pro 文件:

    • 在使用 Qt 向导生成的应用程序.pro 文件格式如下:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      QT       += core gui

      greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

      CONFIG += c++11

      # You can make your code fail to compile if it uses deprecated APIs.
      # In order to do so, uncomment the following line.
      #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0

      SOURCES += \
      main.cpp \
      qtcode.cpp

      HEADERS += \
      qtcode.h

      FORMS += \
      qtcode.ui

      # Default rules for deployment.
      qnx: target.path = /tmp/$${TARGET}/bin
      else: unix:!android: target.path = /opt/$${TARGET}/bin
      !isEmpty(target.path): INSTALLS += target
    • .pro 就是工程文件(project),它是 qmake 自动生成的用于生产 makefile 的配置文件。

Qt的基本操作:

  • QObject 是 Qt 内置的父类。 Qt 中提供的很多类都是直接或者间接继承自 QObject。借助 Qt 助手了解 Qt 的类(找到 Qt 类的族谱)
  1. 基本控件的创建:

    • 实例化一个按键在窗口上,并修改窗口、按键大小,代码如下:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      #ifndef WIDGET_H 
      #define WIDGET_H
      #include <QWidget>
      #include <QPushButton>
      class Widget : public QWidget
      {
      Q_OBJECT
      public:
      Widget(QWidget *parent = nullptr);
      ~Widget();
      QPushButton *MyButton1; //公有的属性:为了后期还可以找到空间
      };
      #endif // WIDGET_H
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      #include "widget.h"
      Widget::Widget(QWidget *parent) : QWidget(parent)
      {
      setWindowTitle("Qt Demo"); //设置窗口名称
      resize(QSize(800, 500)); //设置窗口尺寸
      MyButton1 = new QPushButton(this); //在堆区实例化一个按键,并将地址给类的一个属性
      MyButton1MyButton1->setText("我是个按键"); //修改按键名称
      MyButton1->resize(QSize(500, 300)); //修改按键尺寸
      }
      Widget::~Widget()
      {
      }

      Qt1

  2. 坐标体系:

    • 控件创建之后的左上角默认坐标为(0,0)

      Qt2

  3. 对象树:

    1. Qt 引入对象树的概念,在一定程度上解决了内存问题。
    2. 在 Qt 中创建对象的时候会提供一个 Parent 对象指针,其中 QObject 是以对象树的形式组织起来的。
    3. 当你创建一个 QObject 对象时,会看到 QObject 的构造函数接收一个 QObject 指针作为参数,这个参数就是 parent,也就是父对象指针。这相当于,在创建 QObject 对象时,可以提供一个其父对象,我们创建的这个 QObject 对象会自动添加到其父对象的 children()列表中,也就是说,每个控件都有一个孩子列表当父对象析构的时候,这个 children()列表中的所有对象也会被析构。
    4. QWidget 是能够在屏幕上显示的一切组件的父类。
    5. QWidget 继承自 QObject,因此也继承了这种对象树关系。一个子类自动地成为父组件的一个子组件。因此,它会显示在父组件的坐标系统中,被父组件的边界剪裁。例如,当用户关闭一个对话框的时候,应用程序将其删除,那么,我们希望属于这个对话框的按钮、图标等应该一起被删除。事实就是如此,因为这些都是对话框的子组件。当然,我们也可以自己删除子对象,它们会自动从其父对象 children()列表中删除。比如,当我们删除了一个工具栏时,其所在的主窗口会自动将该工具栏从其子对象列表中删除,并且自动调整屏幕显示。
    6. 工作准则:
      1. 当一个 QObject 对象在堆上创建的时候, Qt 会同时为其创建一个对象树。 不过,对象树中对象的顺序是没有定义的。这意味着,销毁这些对象的顺序也是未定义的。任何对象树中的 QObject 对象 delete 的时候,如果这个对象有 parent, 则自动将其从 parent 的 children()列表中删除;如果有孩子,则自动 delete 每一个孩子。
      2. 注意:由于局部对象的析构顺序应为实例化的相反过程,在使用对象树时,某些特殊情况也会出现一些问题。
      3. 养成习惯:
        1. 按照标准顺序实例化对象—在实例化对象时指定父对象
        2. 大胆的在堆区实例化对象(new)

参考链接: