信号 - 回路内的插槽连接

Posted

技术标签:

【中文标题】信号 - 回路内的插槽连接【英文标题】:Signal - Slot connection inside loop 【发布时间】:2010-06-24 11:10:58 【问题描述】:

在我的代码中,我在循环内创建相同类型的新对象并将信号连接到对象槽。这是我的试验。

A * a;
QList<A *> aList;
int aCounter = 0;
while(aCounter < 2)

   a = new A;
   aList.push_back(a);
   connect(this,SIGNAL(somethingHappened()),aList[aCounter],SLOT(doSometing()));
   aCounter++;


当发出某事发生的信号时。两个对象插槽都被调用。但我需要单独处理它们。 将信号连接到循环内的插槽是错误的吗? 如果没有,我怎么能实现我的愿望?

【问题讨论】:

“分开处理”是什么意思? doSomething() 为每个对象调用一次。我认为没有理由不将信号连接到循环内的插槽,但我不明白你想要实现什么。 我的意思是我想用第一个 A 对象而不是第二个对象做某事。你说:我认为没有理由不将信号连接到循环内的插槽。那么如何将信号连接到 A 类的插槽? 【参考方案1】:

如果我对您的理解正确,您可能想做这样的事情?

A * a;
QList<A *> aList;
int aCounter = 0;
while(aCounter < 2)

   a = new A;
   aList.push_back(a);

   if ( aCounter == 0 )
      connect(this,SIGNAL(somethingHappened()),aList[aCounter],SLOT(doSometing()));

   aCounter++;

这仅将信号连接到第一个对象(但这很明显)。无法将一个信号连接到多个插槽,而只能将其发送到一个。

如果这真的是你的意图,那么如果你真的将这个连接到循环之外会更优雅。

另一种可能性是像以前一样连接所有内容,但在 A 的每个实例中存储某种 ob 成员变量,并使 doSomething() 的行为依赖于此。

【讨论】:

好的。我对 id 变量做同样的事情。这个问题让我更好地理解了信号槽架构。我接受它。 为了更优雅,我建议在一段时间之后进行连接调用,并省略条件...,只需使用 aList[0]【参考方案2】:

据我了解您的问题,您想知道 doSomething() 是否在第一个或第二个对象上被调用。我可能会这样做的方式是首先给 A 类一个布尔成员并将其设置在您的循环中。这样对象就知道它的位置了。如果你有更多的对象,你可以给他们一个柜台。为了保持跟踪,在 A 类上有一个静态计数器变量。这一切都取决于您在这里真正想要实现的目标。

在循环中连接信号非常合理。

A * a;
QList<A *> aList;
int aCounter = 0;

while( aCounter < 2 )

   aList.push_back( new A );
   ++aCounter;


connect( this, SIGNAL( somethingHappened() ), aList[0], SLOT( doSometing() ) );

【讨论】:

我的目的是对第一个 A 对象而不是第二个对象做某事。唯一变量是实现这一目标的唯一方法吗? 这种情况下,只连接第一个。 ;-) 将连接调用拉到循环之外(之后)。将 aList[0] 作为第三个参数传递给 connect()。

以上是关于信号 - 回路内的插槽连接的主要内容,如果未能解决你的问题,请参考以下文章

在 QObject 之间跨不同线程连接信号/插槽

跟随发出的信号到其连接的插槽?

连接子部件插槽上的信号

Qt - 使用 lambda 函数修改先前连接信号的插槽参数

信号和插槽的连接(关于 qlistview) - Qt

Qt连接两个信号和一个插槽