【问题标题】:Signal and slot for multiple widgets多个小部件的信号和插槽
【发布时间】:2017-04-12 09:54:09
【问题描述】:

我的班级中有三个按钮小部件,我想将来自所有三个插槽的点击信号连接到一个插槽。这是我的语法:

QObject::connect(PtrLineedit1, SIGNAL(Clicked()), this, SLOT(myslot()));
QObject::connect(PtrLineedit2, SIGNAL(Clicked()), this, SLOT(myslot()));
QObject::connect(PtrLineedit3, SIGNAL(Clicked()), this, SLOT(myslot()));

但是上面的语法不起作用。我在我的 WizardPage 类之一中使用了上述语法。这个向导有三个页面,其中一个页面(类)有三个按钮,在这个类构造函数中我试图实现。我也用过“clicked()”,但没有运气

【问题讨论】:

  • 你能详细说明“不工作”吗?
  • 考虑重新表述/重构您的问题。以目前的形式,您的问题无法理解。
  • clicked() 应该可以工作,并且 Qt 支持将多个信号连接到一个插槽。检查您的程序输出。如果 qt 无法连接信号和插槽,它应该会通知您。检查这段代码是否执行(你说它在具有这些按钮的类的构造函数中,所以除非它在 ​​if 子句中,否则它应该执行)
  • PtrLineedit 听起来不像按钮...您使用的发件人是否正确?
  • 对不起,它是一个按钮,但命名错误,我想我有一个主向导,其中有这三个页面作为向导页面,我必须更改父小部件吗?当我尝试调试时,我无法到达并且该点被禁用并且在控制台中我也没有得到任何输出说无法连接

标签: c++ qt


【解决方案1】:

首先,没有信号“Clicked”,但是有“clicked”——小写的。

第二 - 最好不要使用宏 SIGNAL 和 SLOT - 它们很容易出错,就像你的情况一样。如果您查看它们,它们正在生成一个字符串,编译器无法检查该字符串。最好使用以下语法:

QObject::connect(PtrLineedit1, &LineEditClass::clicked, this, &ThisClass::myslot);

Cause if you will write then:

QObject::connect(PtrLineedit1, &LineEditClass::Clicked, this, &ThisClass::myslot);

如果没有定义LineEditClass::Clicked,编译时会报错。这将保护您免受拼写错误。

UPD:由于最终我发现了您的另一个问题,该问题面临与此问题相关的问题,因此我已更新此答案并提供更多详细信息,这可能对其他人有所帮助。

在重载方法的情况下,您必须明确告诉编译器应该使用哪一个 - 例如我们有以下内容:

void QComboBox::currentIndexChanged(int index)
void QComboBox::currentIndexChanged(const QString &text)

因此&QComboBox::currentIndexChanged 可能会被模棱两可地解决,你会得到编译错误。要修复它,您需要明确说明要连接的函数的参数是什么:

QObject::connect(comboBox, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, &ThisClass::myComboBoxSlotWithIntArg);

QObject::connect(comboBox, static_cast<void(QComboBox::*)(const QString &)>(&QComboBox::currentIndexChanged), this, &ThisClass::myComboBoxSlotWithStringArg);

【讨论】:

  • 它给出了一个错误,说非标准语法,使用 & 创建指向成员的指针。我的语法: QObject::connect(fileButton3, QToolButton::clicked, this, DynRefWizardPage::myslot);我在工具按钮(filebutton3)上试过了
  • 使用下面的 sysntax:QObject::connect(PtrLineedit1, &LineEditClass::Clicked, this, &ThisClass::myslot);
  • 哦... 非常抱歉 - 感谢您指出 - 再举一个例子,没有人可以免受拼写错误的影响 :) 并使用可以防止拼写错误的东西是个好主意(在我的回答)。
  • SLOT/SIGNAL 宏非常有用,特别是如果您确实想传递您正在调用的函数的名称(例如,如果对象及其连接是通过设置创建的)文件)而不是地址。
  • @rbaleksandar 不能不同意,这完全取决于实现的架构。还有更多的权衡,例如无法使用默认插槽参数。对我来说,这是一个大讨论的重点,什么时候使用什么语法。因此,大多数情况下,这个答案更多地是关于如何缓解最初面临的问题的建议——对于它来说,新语法是一种解决方案。附言我从来没有打算说“永远不要使用 SIGNAL/SLOT 宏”之类的话 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多