gpt4 book ai didi

c++ - Qt 连接到 std::function

转载 作者:行者123 更新时间:2023-12-03 07:15:37 24 4
gpt4 key购买 nike

我遇到了一个问题,我试图在运行时为连接定义信号,因为它取决于哪个派生类创建了相关对象。 IE。我正在定义一个具有抽象槽的基类(派生类相应地实现)。然后,在对象构造点,我通过了 std::function<void(uint)>使用 std::bind(&Class::signalToPass, object, std::placeholder::_1) 到基类的构造函数.然后我尝试使用 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被定义为私有(private) std::function<void(uint)>BaseClass 内.
我可以让它编译两种方式之一,这两种方式都会导致运行时错误......
第一个:
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 的信号/插槽处理的了解远非完美......

最佳答案

我太累了,无法思考这个问题,但没有太累而无法尝试。
我很悲观……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();
}
输出:
Snapshot of testQSignalStdFunction
当然,有必要以 Qt5 风格进行信号/插槽连接。
在 Qt4 中,信号/槽连接是使用 QMeta 的东西完成的,这需要明确地注释槽。在这种情况下,我不会赌 std::function但是仍然可以选择将其调用包装到一个成员函数中,该成员函数像 Qt4 中通常那样声明为插槽。

关于c++ - Qt 连接到 std::function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64541846/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com