【问题标题】:Passing function pointer in place of slot function传递函数指针代替槽函数
【发布时间】:2019-07-23 08:46:27
【问题描述】:

在尝试做这样的事情时:

connect(process1, SIGNAL(waitForReadyRead()), this, SLOT(dataReceived_1()));

我有太多的信号处理过程。 我已经创建了一个包含所有这些进程(对象)的 QList。

为了简化代码,我想把这个连接放在一个循环中,通过遍历processList来执行这个信号槽连接。

类似这样的:

for(int i=0; i<procList.length(); ++i){
   connect(procList[i], SIGNAL(waitForReadyRead()), this, SLOT(data_rcvd[i]));
}

这里data_rcvd是一个包含槽函数的QList~ 但不幸的是,我们不能在 QList 中添加函数。所以我想知道,有没有可能定义函数指针来完成这个任务???

或者您认为,我创建了一个新的 QProcess 类(扩展)并重载函数 waitForReadyRead() 以发出包含此特定信息的指针?

【问题讨论】:

  • 每个进程的插槽有何不同?为什么不将所有进程的信号连接到单个插槽?
  • 您是否有一组固定的方法/函数用作插槽?它总是1:1的关系吗?我们在谈论多少?
  • @tomdol 是的,他们是 1-1 和大约 20 个。

标签: c++ qt signals qlist slots


【解决方案1】:

列表可能不包含函数,但它可能包含函数指针。所以声明一个函数指针列表。在表达式中,函数指示符隐式转换为指向函数类型的指针。指针是对象。

这是一个使用标准容器std::list的演示程序。

#include <iostream>
#include <list>

long long sum( int x, int y ) { return ( long long )x + y; }
long long multiply( int x, int y ) { return ( long long )x * y; }

int main()
{
    std::list<long long( * )( int, int )> lst = { sum, multiply };

    for ( const auto &p : lst ) std::cout << p( 10, 2 ) << '\n';
}

它的输出是

12
20

【讨论】:

  • 你能举个例子吗?
  • 感谢它通常可以正常工作,但是当我在类中定义函数(非静态)时,它不会编译。我总是得到这个错误:必须调用对非静态成员函数的引用。如果全局声明它们,我不能将函数定义为插槽。有什么想法吗?
  • @johnybravo 使用列表的模板参数,如 std::function。
  • 我还在学习,你能给点建议吗?虽然不是完美的,但我看到的一种解决方法是,如果我声明成员函数为静态的,它就可以工作。因为我将只有一个类的实例这样做,在更糟糕的情况下,我将只使用这种技术
  • @johnybravo 正如我已经提到的,您可以使用 std;:function。
猜你喜欢
  • 2013-10-25
  • 2016-06-09
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
相关资源
最近更新 更多