多个小部件的信号和插槽

Signal and slot for multiple widgets

本文关键字:信号 插槽 小部      更新时间:2023-10-16

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

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

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

其次 - 最好不要使用宏 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);