我创建了一个QTableView,它从QSqlTableModel获取数据,但我想设置验证,以便从tableview更改的值与我的数据格式相同。 我怎样才能做到这一点?
答案 0 :(得分:0)
您可以为视图中的项目创建自定义委托,并覆盖其中的setModelData
方法,以拦截插入格式不正确的数据的尝试:
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);
}
实施自定义委托后,您需要将其设置为您的视图:
view->setItemDelegate(new MyDelegate(view));
答案 1 :(得分:0)
我假设您引用的数据格式是一种验证。如果是这样,
另一种方法是添加一个实际的自定义MyValidator -> QValidator
(->
暗示派生自)。 @Dmitry的代码是相同的,除非您必须在委托中将MyValidator
对象实例化为成员,然后在行编辑器上将验证器设置为:
myValidator = new MyValidator; // some args if you need ...
lineEdit->setValidator (&myValidator);
在MyValidator
类中,您应该实现virtual QValidator::State validate(QString& input, int& pos) const
类的纯QValidator
方法。您可以将所有格式和验证规则放在那里。
如果没有按照自定义规则提供正确格式的数据,用户将无法退出行编辑器。无需调用任何其他消息框。
我有一个几乎完全相同的要求,这个解决方案对我很有用!