如何让我的QTableView与QSqlTableModel具有复选框和多行?

How do I get my QTableView with QSqlTableModel to have checkboxes and multiline?

本文关键字:复选框 QSqlTableModel 我的 QTableView      更新时间:2023-10-16

我需要我的QTableView,它使用QSqlTableModel在列中具有复选框并在其他列中具有多行文本编辑,因为当用户按下 Enter 按钮时我需要新行。这是很多东西,但是如果我能得到表格中的复选框,我就可以制作其余的。

我已经尝试过这个,但它不适用于应用程序崩溃。

这里有答案的问题也无济于事,因为他们正在使用QStandardItemModel而我严格需要使用QSqlTableModel.

如何在仍使用QSqlTableModel的同时完成复选框部分?

您可以像这样为复选框创建自定义委托:

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