多个小部件的信号和插槽

时间:2017-04-12 09:54:10

标签: c++ qt

我班上有三个按钮小部件,我希望将所有三个到一个插槽的点击信号连接起来。这是我的语法:

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()”,但没有运气

1 个答案:

答案 0 :(得分:6)

首先,没有信号" Clicked",但是有点击" - 小写的。

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

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

因为如果你会写:

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);