2014-10-28 2 views
6

У меня есть QTableView, и я хочу подтвердить ввод пользователя. Если пользователь вставляет недопустимое значение в ячейку QTableView, я хочу выделить эту ячейку и отключить QPushButton.Проверка ввода пользователя в QTableView

Как я могу это достичь? Могу ли я использовать QValidator?

ответ

9

Да, вы можете это сделать, используйте для этой цели пользовательский номер QItemDelegate (я использовал в качестве примера QIntValidator).

Заголовок:

#ifndef ITEMDELEGATE_H 
#define ITEMDELEGATE_H 

#include <QItemDelegate> 

class ItemDelegate : public QItemDelegate 
{ 
    Q_OBJECT 
public: 
    explicit ItemDelegate(QObject *parent = 0); 

protected: 
    QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; 
    void setEditorData(QWidget * editor, const QModelIndex & index) const; 
    void setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex & index) const; 
    void updateEditorGeometry(QWidget * editor, const QStyleOptionViewItem & option, const QModelIndex & index) const; 

signals: 

public slots: 

}; 

#endif // ITEMDELEGATE_H 

Cpp

#include "itemdelegate.h" 
#include <QLineEdit> 
#include <QIntValidator> 

ItemDelegate::ItemDelegate(QObject *parent) : 
    QItemDelegate(parent) 
{ 
} 

QWidget *ItemDelegate::createEditor(QWidget *parent, 
            const QStyleOptionViewItem &option, 
            const QModelIndex &index) const 
{ 
    QLineEdit *editor = new QLineEdit(parent); 
    editor->setValidator(new QIntValidator); 
    return editor; 
} 


void ItemDelegate::setEditorData(QWidget *editor, 
           const QModelIndex &index) const 
{ 
    QString value =index.model()->data(index, Qt::EditRole).toString(); 
     QLineEdit *line = static_cast<QLineEdit*>(editor); 
     line->setText(value); 
} 


void ItemDelegate::setModelData(QWidget *editor, 
           QAbstractItemModel *model, 
           const QModelIndex &index) const 
{ 
    QLineEdit *line = static_cast<QLineEdit*>(editor); 
    QString value = line->text(); 
    model->setData(index, value); 
} 


void ItemDelegate::updateEditorGeometry(QWidget *editor, 
             const QStyleOptionViewItem &option, 
             const QModelIndex &index) const 
{ 
    editor->setGeometry(option.rect); 
} 

Использование:

#include "itemdelegate.h" 
//... 
ItemDelegate *itDelegate = new ItemDelegate; 
ui->tableView->setItemDelegate(itDelegate); 

В этом случае пользователь не сможет ввода неверных данных, но вы можете использовать следующий:

void ItemDelegate::setModelData(QWidget *editor, 
           QAbstractItemModel *model, 
           const QModelIndex &index) const 
{ 
    QLineEdit *line = static_cast<QLineEdit*>(editor); 

    QIntValidator validator; 
    int pos = 0; 
    QString data = line->text(); 
    if(validator.validate(data,pos) != QValidator::Acceptable) 
    { 
     qDebug() << "not valid";//do something 
    } 
    else 
    { 
     model->setData(index, data); 
    } 
} 

Но в этом случае не забудьте удалить editor->setValidator(new QIntValidator); линия от вашего кода

+0

Спасибо, это работает. Но я не могу удалить числа в ячейках, когда я вставляю действительный ввод. Что мне делать? – splunk

+0

@Aimcorz Я полагаю, что вы используете мой первый пример, поэтому на мои блоки валидатора компьютера входят, но изменение выбора в другую ячейку работает нормально. Я могу предложить вам использовать мой второй пример, предоставьте некоторый способ избежать этого, например, установить пустую строку 'model-> setData (index," ", Qt :: EditRole);' или что-то еще. – Chernobyl