qt-设置来自tableview的输入的验证器

时间:2017-01-18 11:41:06

标签: c++ sql qt qt-creator

我创建了一个QTableView,它从QSqlTableModel获取数据,但我想设置验证,以便从tableview更改的值与我的数据格式相同。 我怎样才能做到这一点?

2 个答案:

答案 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方法。您可以将所有格式和验证规则放在那里。

如果没有按照自定义规则提供正确格式的数据,用户将无法退出行编辑器。无需调用任何其他消息框。

我有一个几乎完全相同的要求,这个解决方案对我很有用!