2014-10-28 8 views
6

Ho un QTableView e voglio convalidare l'input dell'utente. Se l'utente inserisce un valore non valido in una cella di QTableView, voglio evidenziare quella cella e disabilitare uno QPushButton.Convalida l'input dell'utente in un QTableView

Come posso ottenere questo risultato? Posso usare QValidator?

risposta

9

Sì, è possibile farlo, utilizzare QItemDelegate personalizzato per questo scopo (ho utilizzato QIntValidator solo come esempio).

Intestazione:

#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); 
} 

Usage:

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

In questo utente caso non ci sarà di input dati sbagliati in grado, ma è possibile utilizzare la prossima:

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); 
    } 
} 

Ma in questo caso non dimenticare rimuovere editor->setValidator(new QIntValidator); linea dal tuo codice

+0

Grazie, funziona. Ma non riesco a cancellare i numeri nelle celle quando inserisco un input valido. Cosa dovrei fare? – splunk

+0

@Aimcorz Suppongo che tu usi il mio primo esempio, quindi sul mio computer i blocchi di validazione entrano ma cambiare la selezione in un'altra cella funziona normalmente. Posso suggerirti di usare il mio secondo esempio, fornire un modo per evitarlo, ad esempio impostare stringa vuota 'model-> setData (index," ", Qt :: EditRole);' o qualcos'altro. – Chernobyl