Как заставить мой QTableView с QSqlTableModel иметь флажки и многострочный?

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

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

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

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


person SubPrt    schedule 01.02.2014    source источник


Ответы (1)


Вы можете создать собственный делегат для своего флажка следующим образом:

#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));
person Nejat    schedule 01.02.2014
comment
Большое спасибо! Ваша последняя строка кода решила это. Пример делегата, который я связал, оказался рабочим. Что у меня было не так, так это последняя строка кода. При настройке делегата столбца я передавал в качестве параметра MainWindow вместо TableView, и поскольку MainWindow имеет свойства QObject, ошибок времени компиляции не было. Если бы не ты, я бы до сих пор был на нем. Я бы понизила свой пост или удалила бы его, но не могу. Я надеюсь, что это послужит для тех, кто в будущем может совершить ту же ошибку. Спасибо еще раз. - person SubPrt; 01.02.2014