首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选中QCheckBox时启用QCheckBox

选中QCheckBox时启用QCheckBox
EN

Stack Overflow用户
提问于 2016-04-13 12:10:30
回答 2查看 5.3K关注 0票数 0

我对Qt和GUI编程很陌生,当参数列表不匹配时,我不确定将信号连接到插槽的最佳方法。我有一个用Qt设计器制作的“设置”对话框,它包含一系列的QCheckBoxes和QLineEdits,默认情况下禁用QLineEdits。我希望在检查旁边的QLineEdit时启用QCheckBox。

起初,我想将QCheckBox::stateChanged信号连接到QLineEdits::setEnabled插槽,但是当我查看它们时,我发现它们有不同的参数类型,因此这显然无法工作:

代码语言:javascript
复制
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)函数,以便在选中QLineEdit时启用适当的QCheckBox:

代码语言:javascript
复制
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:

代码语言:javascript
复制
void SettingsDialog::setLineEditEnabled(int checkState)
{
    ????->setEnabled(checkState == Qt::Checked);
}

我认为唯一能想到的解决方案是在对话框类中有一系列函数,每个复选框都有一个:

代码语言:javascript
复制
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);
}

然而,这似乎有点混乱(实际上有7个QCheckBox-QLineEdit对,因此我需要7个函数),我觉得我错过了一些东西,这会使这更容易。如果我知道是哪个对象发送了信号,我就可以用一个函数来完成它,这样就更整洁了。

有没有办法从插槽函数中得到发送信号的对象?

如果没有获得信令对象的方法,那么是否有更好的解决方案不需要在对话框类中使用多个函数来启用QLineEdits?

谢谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-13 12:13:17

在这种情况下,您可以使用QCheckBox::toggled(bool)信号而不是stateChanged(int)

代码语言:javascript
复制
connect(checkBox1, SIGNAL(toggled(bool)), lineEdit1, SLOT(setEnabled(bool)));
connect(checkBox2, SIGNAL(toggled(bool)), lineEdit2, SLOT(setEnabled(bool)));
connect(checkBox3, SIGNAL(toggled(bool)), lineEdit3, SLOT(setEnabled(bool)));

但是,在插槽内,您可以获得发送信号的QObject,该信号调用sender()方法。请参阅QObject::发件人()

票数 3
EN

Stack Overflow用户

发布于 2016-04-13 12:50:02

另一种选择是使用QSignalMapper

代码语言:javascript
复制
// Set up a map, just for convenience.
std::map<QCheckBox*, QLineEdit*> widgetMap;
widgetMap.emplace(checkBox1, lineEdit1);
widgetMap.emplace(checkBox2, lineEdit2);
widgetMap.emplace(checkBox3, lineEdit3);

QSignalMapper signalMapper;
connect(signalMapper, SIGNAL(mapped(QWidget*)), SLOT(singleSlotHandlingThemAll(QWidget*)));

connect(checkBox1, SIGNAL(statusChanged(int)), signalMapper, SLOT(map()));
connect(checkBox2, SIGNAL(statusChanged(int)), signalMapper, SLOT(map()));
connect(checkBox3, SIGNAL(statusChanged(int)), signalMapper, SLOT(map()));

signalMapper->setMapping(checkBox1, checkBox1);
signalMapper->setMapping(checkBox2, checkBox2);
signalMapper->setMapping(checkBox3, checkBox3);

下面是singleSlotHandlingThemAll()实现:

代码语言:javascript
复制
void singleSlotHandlingThemAll(QWidget* widget)
{
    // Provided widget is one of the check-boxes.
    QCheckBox* checkBox = static_cast<QCheckBox8>(widget);

    QLineEdit* relatedLineEdit = widgetMap[checkBox];
    relatedLineEdit->setEnabled(checkBox->isChecked());
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36597929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档