如何使用QDataWidgetMapper还原对象的动态属性?

时间:2017-07-15 11:01:01

标签: qt

我有一个表单对话框QDialog,用于使用QDataWidgetMapper更新QTableView行的数据。该项包含QString数据,但我只想显示QCheckBox并使用QCheckbox上的动态属性设置状态更改的背景值。

所有内容(toFirst,toLast,toNext,toPrevious,submit)按预期工作,但恢复不会撤消显示的状态。

我可以使用信号吗?或者我应该尝试覆盖恢复插槽?有什么建议吗?

(删除其他小部件的代码以保持简单)

EditDialog::EditDialog(QStandardItemModel &model, QModelIndex &current, QWidget *parent)
    : QDialog(parent)
{
    cbHomeCLI = new QCheckBox();
    // other widgets ......

    dataMapper->setModel(&model);
    dataMapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit);
    dataMapper->addMapping(cbHomeCLI,3,"useCLI");

    // button connects for toFirst, toXXXX, ..., here ....        
    connect(bttnDiscard,&QPushButton::clicked,dataMapper,&QDataWidgetMapper::revert);
    connect(cbHomeCLI,&QCheckBox::stateChanged,this,&EditDialog::changeProperty);
    connect(dataMapper,&QDataWidgetMapper::currentIndexChanged,this,&EditDialog::initState);

    QGridLayout *layout(new QGridLayout());
    layout->addWidget(cbHomeCLI,2,2);

    setLayout(layout);
    setWindowTitle("....");

    dataMapper->setCurrentModelIndex(current);
}


void EditDialog::initState(int row)
{
    QStandardItemModel *mdl = qobject_cast<QStandardItemModel *>(dataMapper->model());

    if (mdl->item(row,3)->text() == "*31#")
        cbHomeCLI->setChecked(true);
    else
        cbHomeCLI->setChecked(false);
}


void EditDialog::changeProperty(int state)
{
   QCheckBox *from = qobject_cast<QCheckBox *>(sender());

    if (state)
        from->setProperty("useCLI",QString("*31#"));
    else
        from->setProperty("useCLI",QString(""));
}

1 个答案:

答案 0 :(得分:0)

终于找到了解决方案。使用

在EditDialog构造函数中设置eventFilter
cbHomeCLI->installEventFilter(this);

eventFilter使用propertyChanged事件

bool EditDialog::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::DynamicPropertyChange)
    {
        QDynamicPropertyChangeEvent *propEvent = static_cast<QDynamicPropertyChangeEvent *>(event);
        if (propEvent->propertyName() == "useCLI")
        {
            QCheckBox *cb = qobject_cast<QCheckBox *>(obj);
            if (cb->property("useCLI") == "")
                cb->setChecked(false);
            else
                cb->setChecked(true);
            return true;
        }
    }
    // standard event processing
    return QObject::eventFilter(obj, event);
}