有没有办法在不使用连接功能的情况下连接信号和插槽?
如果有办法,请举一些例子。
不,没有其他方法,至少在公共 API 中没有。在 Qt4 中只有connect()
带有SIGNAL()
和SLOT
宏()的函数。
在 Qt5 中,您有另一种类型安全的连接语法,但它仍然使用该connect()
函数。在 QML 中,您可以使用“附加处理程序” onSignal: doStuff()
——但这仅适用于 QML。
有一种方法可以使用元调用接口来避免使用 connect() 函数。取决于您确切需要做什么,尽管这可能不是您正在寻找的解决方案,或者它可能是。
您实质上使用特定语法在 QOBJECT 类中定义了一个回调槽函数,并让 MOC 对“连接”进行排序。
所以说你想使用:
connect(ui->actionButton, SIGNAL(triggered()), this, SLOT(someCallbackSlot()));
但不必使用回调函数...
您可以使用接收信号的 QOBJECT 中成员函数的特定语法隐式执行此操作:
class MyQtObj : public QWidget
{
QObject
private slots:
void on_actionButton_triggered();
}
其中 on_actionButton_triggered 是 someCallbackSlot() 的功能等价物,actionButton 是按钮/动作/信号发射器的名称,trigger() 是发出的信号。
因此,只要信号发射器正确,这些功能中的任何一个都是有效的:
void on_minimizedButton_clicked();
void on_closeButton_released();
ETC
当您运行 Qt Meta-Object-Compiler 并生成此类的 moc_.cpp 文件时,将有一个名为 qt_static_metacall 的函数;这包含一个如下所示的 switch 语句:
void MyQtObj::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
{
if (_c == QMetaObject::InvokeMetaMethod) {
MyQtObj*_t = static_cast<MyQtObj*>(_o);
Q_UNUSED(_t)
switch (_id) {
case 0: _t->on_actionButton_triggered(); break;
default: ;
}
}
}
如果你在其中设置一个断点并触发你的动作/按钮/信号,你应该会看到你的函数被执行。
我不太清楚它是如何工作的细节,当我使用这个无框架的 Qt 窗口代码并且现在在我自己的 Qt C++ 项目中采用它时,我注意到了它。