qt基本认识

Posted by 肥仔 on August 25, 2020

qt的基本认识

qt的模块

.pro文件解读

基本样式如下:

1
2
3
4
5
6
7
8
QT       += core gui  //包含的模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets //大于Qt4版本 才包含widget模块
TARGET = QtFirst  //应用程序名  生成的.exe程序名称
TEMPLATE = app    //模板类型    应用程序模板
SOURCES += main.cpp\   //源文件
        mywidget.cpp
HEADERS  += mywidget.h   //头文件

pro详细解读

  • 注释 从“#”开始,到这一行结束。
  • 模板变量告诉qmake为这个应用程序生成哪种makefile。下面是可供使用的选择:TEMPLATE = app
  • app -建立一个应用程序的makefile。这是默认值,所以如果模板没有被指定,这个将被使用。
    • lib - 建立一个库的makefile。
    • vcapp - 建立一个应用程序的VisualStudio项目文件。
    • -vclib - 建立一个库的VisualStudio项目文件。
    • subdirs -这是一个特殊的模板,它可以创建一个能够进入特定目录并且为一个项目文件生成makefile并且为它调用make的makefile。
  • #指定生成的应用程序名:

    TARGET = QtDemo

  • #工程中包含的头文件 HEADERS += include/painter.h
  • #工程中包含的.ui设计文件

    FORMS += forms/painter.ui

  • #工程中包含的源文件

    SOURCES += sources/main.cpp sources

  • #工程中包含的资源文件

    RESOURCES += qrc/painter.qrc greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

这条语句的含义是,如果QT_MAJOR_VERSION大于4(也就是当前使用的Qt5及更高版本)需要增加widgets模块。如果项目仅需支持Qt5,也可以直接添加“QT += widgets”一句。不过为了保持代码兼容,最好还是按照QtCreator生成的语句编写。

  • #配置信息 CONFIG用来告诉qmake关于应用程序的配置信息。

    CONFIG += c++11 //使用c++11的特性

在这里使用“+=”,是因为我们添加我们的配置选项到任何一个已经存在中。这样做比使用“=”那样替换已经指定的所有选项更安全。

第一个程序解读

创建第一个Qt程序

  • 点击创建项目后,选择项目路径以及 给项目起名称
  • 名称 - 不能有中文 不能有空格
  • 路径 - 不能有中文路径
  • 默认创建有窗口类,myWidget,基类有三种选择: QWidget 、QMainWindow、QDialog

    main函数

  • QApplication a 应用程序对象,有且仅有一个
  • myWidget w;实例化窗口对象
  • w.show()调用show函数 显示窗口
  • return a.exec() 让应用程序对象进入消息循环机制中,代码阻塞到当前行

    按钮控件常用API

  • 创建 QPushButton * btn = new QPushButton
  • 设置父亲 setParent(this)
  • 设置文本 setText(“文字”)
  • 设置位置 move(宽,高)
  • 重新指定窗口大小 resize
  • 设置窗口标题 setWindowTitle
  • 设置窗口固定大小 setFixedSize

    对象树

  • 当创建的对象在堆区时候,如果指定的父亲是QObject派生下来的类或者QObject子类派生下来的类,可以不用管理释放的操作,将对象会放入到对象树中。
  • 一定程度上简化了内存回收机制

    Qt中的坐标系

  • 左上角为 0 , 0 点
  • x以右为正方向
  • y以下为正方向

    信号和槽

  • 连接函数 :connect
  • 参数
    • 参数1 信号的发送者
    • 参数2 发送的信号(函数地址)
    • 参数3 信号的接受者
    • 参数4 处理的槽函数 (函数的地址)
  • 松散耦合
  • 实现 点击按钮 关闭窗口的案例

    connect(btn , &QPushButton::click , this , &QWidget::close);

自定义信号和槽

图解如下:

  • 自定义信号
    • 写到 signals下
    • 返回 void
    • 需要声明,不需要实现
    • 可以有参数 ,可以重载
  • 自定义槽函数
    • 返回void
    • 需要声明 ,也需要实现
    • 可以有参数 ,可以重载
    • 写到 public slot下 或者public 或者全局函数
  • 触发自定义的信号
    • emit 自定义信号
  • 案例-下课后,老师触发饿了信号,学生响应信号,请客吃饭
  • 当自定义信号和槽出现重载
  • 需要利用函数指针 明确指向函数的地址

    void( Teacher:: * tSignal )( QString ) = &Teacher::hungry;

  • QString 转成 char *
  • .ToUtf8() 转为 QByteArray
  • .Data() 转为 Char *
  • 信号可以连接信号
  • 断开信号 disconnect

拓展

  • 信号可以连接信号
  • 一个信号可以连接多个槽函数
  • 多个信号可以连接同一个槽函数
  • 信号和槽函数的参数 必须类型一一对应
  • 信号和槽的参数个数 是不是要一致?信号的参数个数 可以多余槽函数的参数个数
  • 信号槽可以断开连接 disconnect

    Qt4版本写法

  • connect( 信号的发送者, 发送的信号SIGNAL( 信号) ,信号接受者, 槽函数SLOT(槽函数) )
  • 优点 参数直观
  • 缺点 编译器不会检测参数类型

    Lambda表达式

  • []标识符 匿名函数
  • = 值传递
  • & 引用传递
  • () 参数
  • {} 实现体
  • mutable 修饰 值传递变量 ,可以修改拷贝出的数据,改变不了本体
  • 返回值 ->int {}

总结