2017-01-18 1 views

Répondre

0

Vous pouvez créer un délégué personnalisé pour les éléments de votre point de vue et remplacer la méthode setModelData en elle pour intercepter la tentative d'insérer les données mal formatées:

class MyDelegate: public QStyledItemDelegate 
{ 
    Q_OBJECT 
public: 
    explicit MyDelegate(QObject * parent = 0); 

    virtual void setModelData(QWidget * editor, QAbstractItemModel * model, 
      const QModelIndex & index) const Q_DECL_OVERRIDE; 

Q_SIGNALS: 
    void improperlyFormattedDataDetected(int row, int column, QString data); 

private: 
    bool checkDataFormat(const QString & data) const; 
}; 

MyDelegate::MyDelegate(QObject * parent) : 
    QStyledItemDelegate(parent) 
{} 

void MyDelegate::setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex & index) const 
{ 
    // Assuming the model stores strings so the editor is QLineEdit 
    QLineEdit * lineEdit = qobject_cast<QLineEdit*>(editor); 
    if (!lineEdit) { 
     // Whoops, looks like the assumption is wrong, fallback to the default implementation 
     QStyledItemDelegate::setModelData(editor, model, index); 
     return; 
    } 

    QString data = lineEdit->text(); 
    if (checkDataFormat(data)) { 
     // The data is formatted properly, letting the default implementation from the base class set this to the model 
     QStyledItemDelegate::setModelData(editor, model, index); 
     return; 
    } 

    // If we got here, the data format is wrong. We should refuse to put the data into the model 
    // and probably signal about this attempt to the outside world so that the view can connect to this signal, 
    // receive it and do something about it - show a warning tooltip or something. 
    emit improperlyFormattedDataDetected(index.row(), index.column(), data); 
} 

Une fois que le délégué personnalisé est mis en œuvre, vous devez définissez-le à votre vue:

view->setItemDelegate(new MyDelegate(view)); 
0

Je suppose que le format de données auquel vous faites référence est un type de validation. Si oui, une autre façon de le faire serait d'ajouter une coutume réelle MyValidator -> QValidator (-> implique dérivé de). @ Code de Dmitry serait le même, sauf que vous devez instancier un objet MyValidator dans votre délégué en tant que membre, puis définissez le validateur sur l'éditeur de ligne:

myValidator = new MyValidator; // some args if you need ... 
lineEdit->setValidator (&myValidator); 

Dans la classe MyValidator vous devez mettre en œuvre le virtual QValidator::State validate(QString& input, int& pos) const pur méthode de la classe QValidator. Vous pouvez y mettre toutes vos règles de mise en forme et de validation.

L'utilisateur ne pourra pas sortir de l'éditeur de ligne sans fournir les données dans le bon format conformément à vos règles personnalisées. Pas besoin d'invoquer une autre boîte de message.

J'avais exactement la même exigence, et cette solution a très bien fonctionné pour moi!

+0

ouais je sais à propos de la modification de ligne mais comment l'implémenter dans la vue de tableau –

+0

Utilisez la réponse de @ Dmitry pour créer un délégué personnalisé. De plus, vous devez remplacer la méthode 'createEditor', puis, comme indiqué dans ma réponse, attacher un 'QValidator' personnalisé à l'éditeur créé, tout en fournissant la méthode' validate() '. – NameRakes