Qt::UniqueConnection是如何工作的?

8
我不太理解 Qt::UniqueConnection 'flag' 是如何工作的。 Qt::UniqueConnection枚举Qt::ConnectionType中的一个常量,描述了信号和槽之间可用的连接类型。
根据文档中的说明,Qt::UniqueConnection常量是:

与AutoConnection相同,但仅在它不重复现有连接时才建立连接。也就是说,如果对于同一对象对的同一信号已经连接到同一槽,则连接将失败。这种连接类型是在Qt 4.6中引入的。

基于以下示例:
  for (int index = 0; index < 2; ++index)
  {
      QPushButton *myButton = new QPushButton("Button", this);
      connect(myButton, SIGNAL(clicked()), this, SLOT(doSomething()), Qt::UniqueConnection);
  }
  1. 它会基于按钮的内存地址创建2个独立的连接吗(我猜是这样)?

  2. 还是仅会创建一个连接(第二个将失败),基于对象类型(QPushButton)和使用的信号和槽?


2
它将建立两个连接,因为您创建了两个不同的对象。如果尝试为同一对象创建多个相同的连接,则会失败。 - vahancho
谢谢@vahancho。这可以作为答案。 - KelvinS
1个回答

15

如果您不加上这个标记,意味着您可以多次进行相同的连接:即相同的发送对象、相同的接收对象、相同的信号和相同的槽。

每次进行此连接时,槽将被调用多次。

但是,当不必要时,您不应滥用此标记,因为它会进行验证以查看您的连接是否已存在,这意味着代码会变慢。

注意:对于lambda表达式、非成员函数和函数对象,Qt::UniqueConnection 不起作用;它们仅适用于连接到成员函数。


谢谢@basslo。是的,我知道,但我需要创建一个唯一的连接,并且我想知道它是针对对象类型还是对象本身(内存地址)唯一的。 - KelvinS
谢谢,也感谢您关于不滥用此标志的提示。 - KelvinS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接