Как мне получить мой QTableView с QSqlTableModel, чтобы иметь флажки и многострочный?

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

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

вопрос здесь ответ не помогает, потому что они используют 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));
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]