2014-02-01 1 views
2

Мне нужен мой QTableView, который обрабатывает элементы, используя QSqlTableModel, чтобы иметь в столбце флажки и иметь в других столбцах многострочные текстовые элементы, потому что мне нужны новые строки, когда пользователь нажимает кнопку «Ввод». Это много, но если я могу установить флажки в таблице, я могу сделать все остальное.Как получить мой QTableView с QSqlTableModel, чтобы иметь флажки и многострочные?

Я пробовал this, но он не работает для сбоев приложения.

question здесь, у которого есть ответ, не помогает ни потому, что они используют QStandardItemModel, и мне строго нужно использовать QSqlTableModel.

Как я могу выполнить флажок, используя QSqlTableModel?

ответ

2

Вы можете создать пользовательский делегат для флажка, как это:

#include <QItemDelegate> 

#include <QCheckBox> 

#include <QPainter> 



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

    void paint(QPainter *painter, 
         const QStyleOptionViewItem &option, 
         const QModelIndex &index) const; 


    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; 

    mutable QCheckBox * theCheckBox; 

private slots: 

    void setData(bool val); 


}; 


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

void CheckBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const 
{ 
    drawDisplay(painter,option,option.rect,index.model()->data(index, Qt::DisplayRole).toBool()?QString("  ").append(tr("Yes")):QString("  ").append(tr("No"))); 
    drawFocus(painter,option,option.rect); 
} 

QWidget *CheckBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const 
{ 
    theCheckBox = new QCheckBox(parent); 
    QObject::connect(theCheckBox,SIGNAL(toggled(bool)),this,SLOT(setData(bool))); 
    return theCheckBox; 
} 

void CheckBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const 
{ 
    int val = index.model()->data(index, Qt::DisplayRole).toInt(); 

    (static_cast<QCheckBox*>(editor))->setChecked(val); 

} 

void CheckBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const 
{ 
    model->setData(index, (int)(static_cast<QCheckBox*>(editor)->isChecked())); 
} 


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

void CheckBoxDelegate::setData(bool val) 
{ 
    emit commitData(theCheckBox); 
} 

Далее в коде назначить свой собственный пункт делегата нужного столбца:

ui->myTable->setItemDelegateForColumn(5,new CheckBoxDelegate(ui->myTable)); 
+1

Большое спасибо! Ваша последняя строка кода решила это. Приведенный в качестве примера делегат я работал. То, что у меня было, было последней строкой кода. При настройке делегата столбца я передавал в качестве параметра MainWindow вместо TableView и потому, что у MainWindow были свойства QObject, ошибок времени компиляции не было. Если бы не ты, я все равно был бы на нем. Я бы понизил свой пост или удалил его, но я не могу. Я надеюсь, что это послужит для любого в будущем, которое может совершить ту же ошибку. Еще раз спасибо. – SubPrt