c++ - 多个小部件的信号和插槽

标签 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()”,但运气不好

最佳答案

首先,没有信号“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/

相关文章:

android - QtCreator 甚至无法构建空项目 - 执行此行时发生以下错误

c++ - 使用 MYSQL 服务器 (mingw32-make) 为 QT 构建驱动程序时出错

qt - 单文件Qt4演示

c++ - 编译结果报错 "undefined symbols for architecture i386"

c++ - 显示占用 8 个字节的 int

c++ - 在 case 语句中使用 {}。为什么?

qt - 无法启动程序。路径或权限错误?在Qt中

c++ - 更改 Code::Blocks 中的主要方法?

c++ - 是否可以为 std::array 定义隐式转换运算符?

c++ - 限制为子矩形的qt拖放