0

有没有办法在不使用连接功能的情况下连接信号和插槽?

如果有办法,请举一些例子。

4

2 回答 2

4

不,没有其他方法,至少在公共 API 中没有。在 Qt4 中只有connect()带有SIGNAL()SLOT宏()的函数。

在 Qt5 中,您有另一种类型安全的连接语法,但它仍然使用该connect()函数。在 QML 中,您可以使用“附加处理程序” onSignal: doStuff()——但这仅适用于 QML。

于 2017-08-10T09:43:05.713 回答
2

有一种方法可以使用元调用接口来避免使用 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++ 项目中采用它时,我注意到了它。

于 2018-03-13T10:55:10.850 回答