Qt:事件绑定

自动绑定

用法

  1. UI设计器中设置好objectName,最好全局唯一;
  2. 然后ui文件对应的c++文件中添加回调函数,格式:[on_objectName_[动作名(信号)]](槽)
  3. 动作查看:ui类里包含了该UI界面的所有组件,点进去看以ed结尾的(除去set开头的)既是它的动作。

原理

ui文件自动生成的头文件中有行代码

QMetaObject::connectSlotsByName(MainWindow);

其作用是如其名称一样,用来将QObject *o里的子孙QObject的某些信号按照其objectName连接到o的槽上。
参考解读QT信号与槽机制里 QMetaObject::connectSlotsByName(QObject *o)的源码

手动绑定

用法

  1. ui文件对应的c++文件中添加回调函数;
  2. 在入口方法ui->setupUi(this);后面添加connect(ui->要绑定的action(发送者), &QAction::triggered(要绑定的动作(信号)), this(接受者), &MainWindow::要绑定到那个函数(槽));

原理

有待研究…

关注以下几个调用函数

FuncType::template call<Args, R>(static_cast<QSlotObject*>(this_)->function, static_cast<typename FuncType::Object *>(r), a);

// |
// v

FunctorCall<typename Indexes<ArgumentCount>::Value, SignalArgs, R, Function>::call(f, o, arg);

// |
// v

static void call(SlotRet (Obj::*f)(SlotArgs...), Obj *o, void **arg) {
            (o->*f)((*reinterpret_cast<typename RemoveRef<SignalArgs>::Type *>(arg[II+1]))...), ApplyReturnValue<R>(arg[0]);
        }

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!