我类有三个按钮小部件,我想将所有三个按钮的点击信号连接到一个插槽。这是我的语法:
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”,但是有“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);
关于c++ - 多个小部件的信号和插槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43366207/