【问题标题】:A function wrapper around QObject::connectQObject::connect 周围的函数包装器
【发布时间】:2016-02-18 23:10:48
【问题描述】:

我正在尝试编写一个将其参数传递给QObject::connect 的函数。

template <typename Func1, typename Func2>
void addConnection(const QObject* sender, Func1 signal, Func2 slot)
{
    m_connections.push_back(QObject::connect(sender, signal, slot));
}

我是这样称呼它的:

addConnection(&m_scannerSystem, &ScannerSystem::signalStatus, [=](int status){ this->onStatusChanged(status); });

这会导致错误:

'QObject::connect' : none of the 4 overloads could convert all the argument types

但我无法弄清楚为什么它不起作用。

【问题讨论】:

标签: c++ qt templates lambda signals-slots


【解决方案1】:

你的问题是你试图传递一个指向 QObject 的指针,但是在这种情况下你将如何调用另一个对象的成员函数(在你的例子中是 ScannerSysterm)?系统必须知道传递的发件人的实际类型。所以你可以这样修复它:

template <typename Sender, typename Func1, typename Func2>
void addConnection(const Sender* sender, Func1 signal, Func2 slot)
{
    QObject::connect(sender, signal, slot);
}

或者通过使用一些神奇的 Qt 特征:

template <typename Func1, typename Func2>
void addConnection(const typename QtPrivate::FunctionPointer<Func1>::Object* sender, Func1 signal, Func2 slot)
{
    QObject::connect(sender, signal, slot);
}

【讨论】:

  • 啊,当然,我认为传递 lambda 有问题,完全错过了。我也喜欢您的解决方案,因为它不必使用 Qt 的私有 API。
【解决方案2】:

您是否阅读过编译器错误信息?编译器在 5 个重载函数中不知道合适的 QObject::connect() 函数。 QT doc

如果你使用下面的代码,编译就会成功。

addConnection( &m_scannerSystem, SIGNAL( signalStatus( int ) ), this, SLOT( onStatusChanged( int ) ) );

【讨论】:

  • 我无法使用此重载连接到 lambda。我正在使用新的 Qt 5 语法:wiki.qt.io/New_Signal_Slot_Syntax
  • 我不明白你为什么只使用 lambda。我认为在这种情况下 lambda 不是强制性的。我错了吗?
猜你喜欢
  • 1970-01-01
  • 2015-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多