簡體   English   中英

選中QCheckBox時啟用QCheckBox

[英]Enabling QCheckBox when QCheckBox is checked

我是Qt和GUI編程的新手,不確定參數列表不匹配時將信號連接到插槽的最佳方法。 我有一個使用Qt Designer創建的設置對話框,它包含一系列QCheckBoxes和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的多個功能?

謝謝你的幫助。

在這種情況下,可以使用QCheckBox::toggled(bool)信號代替stateChanged(int)

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 :: sender()

另一種選擇是使用QSignalMapper

// 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()實現:

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());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM