J'ai créé un QTableView qui obtient des données de QSqlTableModel mais je veux définir la validation pour que la valeur changée de tableview soit la même avec mon format de données. comment puis-je faire cela?qt- définition du validateur pour la saisie depuis tableview
Répondre
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));
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!
ouais je sais à propos de la modification de ligne mais comment l'implémenter dans la vue de tableau –
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