首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Qt连接到std::function

Qt连接到std::function
EN

Stack Overflow用户
提问于 2020-10-27 01:12:51
回答 1查看 632关注 0票数 1

我遇到了一个问题,我试图在运行时为连接定义信号,因为这取决于哪个派生类创建了有问题的对象。也就是说,我定义了一个基类,它有一个抽象槽(派生类相应地实现了这个槽)。然后,在对象构造时,我使用std::bind(&Class::signalToPass, object, std::placeholder::_1)std::function<void(uint)>传递给基类的构造函数。然后,我尝试使用QObject::connect将这个std::function连接到前面提到的抽象插槽。我将试着在下面列出一个例子:

派生类构造函数:

代码语言:javascript
运行
复制
DerviedClass(SomeClass *someObject) : BaseClass(std::bind(&SomeClass::methodToConnect, someObject, std::placeholders_1)
{
    ...
}

基类构造函数:

代码语言:javascript
运行
复制
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)>

我可以使用以下两种方法之一进行编译,这两种方法都会导致运行时错误……第一个:

代码语言:javascript
运行
复制
QObject::connect(
    this,
    SIGNAL(m_methodToConnect),
    this,
    SLOT(abstractSlot));

这将导致运行时警告:

代码语言:javascript
运行
复制
QObject::connect: Parentheses expected, signal DerivedClass::m_methodToConnect in /home/...

我以为我已经明白了,所以改成这样:

代码语言:javascript
运行
复制
QObject::connect(
    this,
    SIGNAL(m_methodToConnect(uint)),
    this,
    SLOT(abstractSlot(uint)));

这将导致运行时警告:

代码语言:javascript
运行
复制
QObject::connect: No such signal DerivedClass::m_methodToConnect(uint) in /home/...

我还尝试将someObject从派生类传递到基类,并将其用作QObject::connect中的“发送者”,但结果相同。在所有情况下,我都可以在我的目标上编译、构建和安装,但正如预期的那样,没有建立连接。

在这方面的任何帮助都将不胜感激,作为一名仅供参考的人(可能从这篇文章中可以看出)我对Qt的信号/插槽处理的知识还远远不够完美……

EN

回答 1

Stack Overflow用户

发布于 2020-10-27 01:35:16

我太累了,不能仔细考虑这个问题,但也不会太累,不想尝试这个。

我让…很悲观

std::function对象可以像使用任何函数或函数器一样使用。它必须提供匹配的签名-仅此而已。

演示:

代码语言:javascript
运行
复制
#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。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64541846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档