我是Qt和GUI编程的新手,当参数列表不匹配时,我不确定将信号连接到插槽的最佳方法 . 我有一个用Qt Designer制作的设置对话框,它包含一系列QCheckBox和QLineEdits,默认情况下禁用QLineEdits . 我想在选中它旁边的QCheckBox时启用QLineEdit .
起初我想把QCheckBox :: stateChanged信号连接到QLineEdits :: setEnabled插槽,但是当我看到时我发现它们有不同的参数类型,所以这显然不起作用:
connect(checkBox1, SIGNAL(stateChanged(int)), lineEdit1, SLOT(setEnabled(bool)));
connect(checkBox2, SIGNAL(stateChanged(int)), lineEdit2, SLOT(setEnabled(bool)));
connect(checkBox3, SIGNAL(stateChanged(int)), lineEdit3, SLOT(setEnabled(bool)));
接下来我想在对话框类中创建setLineEditEnabled(int)函数,以在选中QCheckBox时启用相应的QLineEdit:
connect(checkBox1, SIGNAL(stateChanged(int)), settingsDialog, SLOT(setLineEditEnabled(int)));
connect(checkBox2, SIGNAL(stateChanged(int)), settingsDialog, SLOT(setLineEditEnabled(int)));
connect(checkBox3, SIGNAL(stateChanged(int)), settingsDialog, SLOT(setLineEditEnabled(int)));
当我开始编写setLineEditEnabled()函数时,我意识到无法知道哪个QCheckBox发送了信号,所以我不知道应该启用哪个QLineEdit:
void SettingsDialog::setLineEditEnabled(int checkState)
{
????->setEnabled(checkState == Qt::Checked);
}
我能想到的唯一解决方案是想到在对话框类中有一系列函数,每个复选框都有一个:
connect(checkBox1, SIGNAL(stateChanged(int)), settingsDialog, SLOT(setLineEdit1Enabled(int)));
connect(checkBox2, SIGNAL(stateChanged(int)), settingsDialog, SLOT(setLineEdit2Enabled(int)));
connect(checkBox3, SIGNAL(stateChanged(int)), settingsDialog, SLOT(setLineEdit3Enabled(int)));
void SettingsDialog::setLineEdit1Enabled(int checkState)
{
lineEdit1->setEnabled(checkState == Qt::Checked);
}
void SettingsDialog::setLineEdit2Enabled(int checkState)
{
lineEdit2->setEnabled(checkState == Qt::Checked);
}
void SettingsDialog::setLineEdit3Enabled(int checkState)
{
lineEdit3->setEnabled(checkState == Qt::Checked);
}
然而,这似乎有点混乱(实际上有七个QCheckBox-QLineEdit对,所以我需要七个函数),我觉得我错过了一些可以使这更容易的东西 . 如果我知道哪个对象发送了信号,我可以用一个函数来完成它,这将更加整洁 .
有没有办法获得从插槽函数发送信号的对象?
如果无法获取信令对象,是否有更好的解决方案,不涉及在对话框类中启用多个函数来启用QLineEdits?
谢谢你的帮助 .
2 回答
在这种情况下,您可以使用
QCheckBox::toggled(bool)
信号而不是stateChanged(int)
.但是,在插槽内,您可以获取发送调用
sender()
方法的信号的QObject
. 见QObject::sender()另一种选择是使用 QSignalMapper :
这是
singleSlotHandlingThemAll()
实现: