使用 Qt 修改任何复选框状态时执行操作

Do an action while any checkbox state is modified with Qt

在我的程序中,我通过这种方式在界面中填充了很多复选框:

void VGCCC::addMaterialToUI(QDomNodeList _materialNodeList, QWidget* _areaWidget, QLayout* _layout, QWidget* _layoutWidget, int _maTable)
{
    for(int i=0; i< _materialNodeList.count();i++)
    {
        QDomElement materialElement = _materialNodeList.at(i).toElement();
        QString elementFile = materialElement.attribute("file");
        QString elementId = materialElement.attribute("id");
        QString elementLabel = elementId;
        elementLabel += "  -  ";
        elementLabel += materialElement.attribute("label");
        QCheckBox* checkbox = new QCheckBox(elementLabel);
        _layout->addWidget(checkbox);
        _layoutWidget->adjustSize();
        _areaWidget->setMinimumHeight(_layoutWidget->height());
        _areaWidget->setMinimumWidth(_layoutWidget->width());

        configuration c;
        c.path = (m_igmPath+elementFile).toStdString();
        c.id = elementId.toInt();
        c.name = elementLabel.toStdString();
        if(_maTable==0)
        {
            m_materialSectionMap[checkbox] = c;
        }
        else
        {
            m_materialPostMap[checkbox] = c;
        }
    }
}

我想知道如何检索这些 "abstract" 复选框。更确切地说,如果选中其中一个复选框,我想调用另一个这样的函数:

    connect(anyCheckbox,SIGNAL(stateChanged(anyCheckbox)), this, SLOT(doSomethingFunctionIfCheckboxIsChecked()));

困难在于,在我的 UI 中,这些复选框不存在,所以我无法将它们连接到我的函数。我该如何解决?

你可以,例如将指向您的复选框对象的指针收集到一个列表中,以便以后可以访问或 "retrieve" 它们。

您可以将每个复选框的 stateChanged 信号连接到同一个插槽,然后在任何复选框的状态发生更改时调用该插槽。如果您需要知道哪个特定复选框有问题,您可以在插槽中将 sender() 投射到复选框。另一种选择是使用 QSignalMapper.

在您的 class 声明中:

private slots:
    void checkboxStateChanged(int state)        

private:
    QList<QCheckBox*> m_checkboxes;

在您的 class 定义中:

void VGCCC::addMaterialToUI(QDomNodeList _materialNodeList, QWidget* _areaWidget, QLayout* _layout, QWidget* _layoutWidget, int _maTable)
{
    ...
    QCheckBox* checkbox = new QCheckBox(elementLabel);
    m_checkboxes.append(checkbox);
    connect(checkbox, SIGNAL(stateChanged(int)), this, SLOT(checkboxStateChanged(int)));
    ...
}

void VGCCC::checkboxStateChanged(int state)
{
    // Here your can e.g. call doSomethingFunctionIfCheckboxIsChecked()

    QCheckBox* checkbox = qobject_cast<QCheckBox*>(sender());
    if (checkbox)
    {
        // checkbox points to the object whose state changed
    }

}