C++ 如何在不使用连接功能的情况下连接信号和插槽?

C++ 如何在不使用连接功能的情况下连接信号和插槽?,c++,qt,qt4,qt-signals,qt-slot,C++,Qt,Qt4,Qt Signals,Qt Slot,有没有一种方法可以在不使用连接功能的情况下连接信号和插槽 如果存在一种方法,请给出一些例子。不,没有其他方法,至少在公共API中没有。在Qt4中,只有带有SIGNAL()和SLOT宏()的connect()函数 在Qt5中,您有另一种类型安全连接语法,但它仍然使用connect()函数。在QML中,您可以使用“附加的处理程序”-onSignal:doStuff()——但这仅适用于QML。不,没有其他方法,至少在公共API中没有。在Qt4中,只有带有SIGNAL()和SLOT宏()的connect

有没有一种方法可以在不使用连接功能的情况下连接信号和插槽


如果存在一种方法,请给出一些例子。

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


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

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


在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是按钮/动作/信号发射器的名称,triggered()是发出的信号

因此,只要信号发射器正确,这些函数中的任何一个都是有效的:

void on_minimizedButton_clicked();

void on_closeButton_released();

当您运行Qt元对象编译器并生成该类的moc_uu.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: ;
        }
    }
}
void MyQtObj::qt\u static\u metacall(QObject*\u o,QMetaObject::Call\u c,int\u id,void**a)
{
if(_c==QMetaObject::InvokeMetMethod){
MyQtObj*_t=静态强制转换(_o);
Q_未使用(_t)
开关(_id){
案例0:_t->on_actionButton_triggered();中断;
违约:;
}
}
}
如果您在此设置断点并触发您的操作/按钮/信号,您应该会看到您的函数被执行


虽然我不太清楚这是如何工作的,但我注意到它在我自己的QT C++项目中使用过,

有一种方法使用元调用接口避免使用连接()函数。这取决于你到底需要做什么,尽管这可能不是你正在寻找的解决方案,也可能是

实际上,您在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是按钮/动作/信号发射器的名称,triggered()是发出的信号

因此,只要信号发射器正确,这些函数中的任何一个都是有效的:

void on_minimizedButton_clicked();

void on_closeButton_released();

当您运行Qt元对象编译器并生成该类的moc_uu.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: ;
        }
    }
}
void MyQtObj::qt\u static\u metacall(QObject*\u o,QMetaObject::Call\u c,int\u id,void**a)
{
if(_c==QMetaObject::InvokeMetMethod){
MyQtObj*_t=静态强制转换(_o);
Q_未使用(_t)
开关(_id){
案例0:_t->on_actionButton_triggered();中断;
违约:;
}
}
}
如果您在此设置断点并触发您的操作/按钮/信号,您应该会看到您的函数被执行


虽然我不太清楚这是如何工作的,但是我注意到了,当我使用它,并且现在在我自己的QT+C++项目中采用它时,

你为什么要避免使用<代码>连接< /COD>方法?如果你使用QT设计器,你可以在里面做连接,但仅适用于现有信号和时隙请解释上下文以及您提出此问题的原因,请考虑您可能感兴趣的原因。为什么要避免使用
connect
方法?如果您使用的是Qt designer,您可以在内部进行连接,但仅适用于现有信号和时隙请解释上下文以及您提出此问题的原因,想想你可能感兴趣的。我见过一些发出信号的代码,但我没有看到连接。连接可以在其他任何地方。连接和发射是完全不同的事情。它甚至可能在一些构造函数或类似的东西中自动发生。而且,你可以发出一个与任何东西都没有连接的信号,如果那样的话,它就不会做任何事情。信号只针对潜在的听众。无论是否有人连接,它们都必须发射。因为实现该信号的类型不知道谁将最终连接。如果我发出一个信号,如何让另一个函数处理该信号。你不关心谁连接,你关心的是通知任何潜在的侦听器。这取决于连接的函数。当发出信号时,所有连接的插槽都将按顺序执行。我见过一些发出信号的代码,但没有看到connect。连接可以在其他任何地方。连接和发射是完全不同的事情。它甚至可能在一些构造函数或类似的东西中自动发生。而且,你可以发出一个与任何东西都没有连接的信号,如果那样的话,它就不会做任何事情。信号只有在那里才能发出