2017-07-15 5 views
0

QDataWidgetMapperを使用してQTableView行のデータを更新するフォームダイアログQDialogがあります。このアイテムにはQStringデータが含まれていますが、QCheckboxを表示し、QCheckboxの動的プロパティを使用して状態変更時にバックグラウンドで値を設定したいだけです。QDataWidgetMapperでオブジェクトの動的プロパティを元に戻すにはどうすればいいですか?

すべて(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("")); 
} 

答えて

0

最後に解決策を見つけました。

cbHomeCLI->installEventFilter(this); 

でEditDialogコンストラクタでeventFilterを設定し、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); 
} 
関連する問題