# Qt

Qt-C++ (opens new window)

  • 体积小
  • 运行时耗用系统资源小
  • 上层接口与硬件无关
  • 高度可移植

# 什么是Qt事件?

Qt 事件指的是应用程序和用户之间的交互过程,例如用户按下某个按钮,点击某个输入框等等。

Qt事件的本质是驱动开发。

# 事件驱动开发-监听器模式

事件驱动的本质实质上是遍历-阻塞-等待,即 for-loop + sleep 模式。

int main()
{
    while (true) {
        Message msg = GetMessage();
        if (msg.isQuitRequest)
            break;
        
        // Process the msg object...
    }

    // Clean up here...
    return 0;
}

当有事件发生时,例如按钮点击事件,即按钮被点击时,监控键盘的线程被唤醒,从而调用了特定的程序。

事件驱动的基本模式是监听器模式, 监听器模式 (qq.com) (opens new window) ,监听器监听控件,如果对应控件被唤醒,则触发特定的事件。

监听器模式在进行一定程度的发展和筛选后,发展出了两个比较通用的模型,即Reactor模式和Preactor模式。

而Qt中的事件驱动,其传播媒介为信号和槽。。

# 什么是信号和槽?

通过信号的发送和槽,进行两个对象之间的通信。

# 事件

事件是指用户发起点击、下拉、删除等操作的过程。

# 动作

动作是指用户的点击、下拉、删除等具体动作。

# 信号

信号是指用户在发起某个事件时,传递的信号。

在 Qt 中,用户和控件的每次交互过程称为一个事件,比如“用户点击按钮”是一个事件,“用户关闭窗口”也是一个事件。每个事件都会发出一个信号,例如用户点击按钮会发出“按钮被点击”的信号,用户关闭窗口会发出“窗口被关闭”的信号。

Qt 中的所有控件都具有接收信号的能力,一个控件还可以接收多个不同的信号。对于接收到的每个信号,控件都会做出相应的响应动作。

1655090817527

# connect()函数实现信号和槽

connect() 是 QObject 类中的一个静态成员函数,专门用来关联指定的信号函数和槽函数。

  • 信号发送者
  • 信号函数
  • 信号的接收者
  • 接收信号的槽函数
QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)

各个参数的含义分别是:

  • sender:指定信号的发送者;
  • signal:指定信号函数,信号函数必须用 SIGNAL() 宏括起来;
  • reveiver:指定信号的接收者;
  • method:指定接收信号的槽函数,槽函数必须用 SLOT() 宏括起来;
  • type 用于指定关联方式,默认的关联方式为 Qt::AutoConnection,通常不需要手动设定。

一个 connect() 函数只能关联一个信号函数和一个槽函数,程序中可以包含多个 connect() 函数,能实现以下几种效果:

  • 关联多个信号函数和多个槽函数;
  • 一个信号函数可以关联多个槽函数,当信号发出时,与之关联的槽函数会一个接一个地执行,但它们执行的顺序是随机的,无法人为指定哪个先执行、哪个后执行;
  • 多个信号函数可以关联同一个槽函数,无论哪个信号发出,槽函数都会执行。