我遇到了一个问题,我试图在运行时为连接定义信号,因为这取决于哪个派生类创建了有问题的对象。也就是说,我定义了一个基类,它有一个抽象槽(派生类相应地实现了这个槽)。然后,在对象构造时,我使用std::bind(&Class::signalToPass, object, std::placeholder::_1)
将std::function<void(uint)>
传递给基类的构造函数。然后,我尝试使用QObject::connect
将这个std::function
连接到前面提到的抽象插槽。我将试着在下面列出一个例子:
派生类构造函数:
DerviedClass(SomeClass *someObject) : BaseClass(std::bind(&SomeClass::methodToConnect, someObject, std::placeholders_1)
{
...
}
基类构造函数:
BaseClass(std::function<void(uint)> methodToConnect) m_methodToConnect(methodToConnect)
{
createConnections();
}
void BaseClass::createConnections()
{
QObject::connect(
this,
m_methodToConnect,
this,
&BaseClass::abstractSlot);
...
}
其中,m_methodToConnect
被定义为BaseClass
中的私有std::function<void(uint)>
。
我可以使用以下两种方法之一进行编译,这两种方法都会导致运行时错误……第一个:
QObject::connect(
this,
SIGNAL(m_methodToConnect),
this,
SLOT(abstractSlot));
这将导致运行时警告:
QObject::connect: Parentheses expected, signal DerivedClass::m_methodToConnect in /home/...
我以为我已经明白了,所以改成这样:
QObject::connect(
this,
SIGNAL(m_methodToConnect(uint)),
this,
SLOT(abstractSlot(uint)));
这将导致运行时警告:
QObject::connect: No such signal DerivedClass::m_methodToConnect(uint) in /home/...
我还尝试将someObject
从派生类传递到基类,并将其用作QObject::connect
中的“发送者”,但结果相同。在所有情况下,我都可以在我的目标上编译、构建和安装,但正如预期的那样,没有建立连接。
在这方面的任何帮助都将不胜感激,作为一名仅供参考的人(可能从这篇文章中可以看出)我对Qt的信号/插槽处理的知识还远远不够完美……
发布于 2020-10-27 01:35:16
我太累了,不能仔细考虑这个问题,但也不会太累,不想尝试这个。
我让…很悲观
std::function
对象可以像使用任何函数或函数器一样使用。它必须提供匹配的签名-仅此而已。
演示:
#include <QtWidgets>
int main(int argc, char** argv)
{
QApplication app(argc, argv);
// setup GUI
QPushButton qBtn("Click me");
qBtn.show();
// install signal handlers
std::function<void(bool)> func = [](bool) { qDebug() << "Button clicked."; };
QObject::connect(&qBtn, &QPushButton::clicked, func);
// runtime loop
return app.exec();
}
输出:
当然,有必要将信号/插槽连接为Qt5样式。
在Qt4中,信号/时隙连接是使用QMeta完成的,这需要显式地说明时隙。在这种情况下,我不会把赌注押在std::function
上,但仍然可以选择将其调用包装到一个成员函数中,该成员函数像Qt4中通常一样被声明为slot。
https://stackoverflow.com/questions/64541846
复制相似问题