gpt4 book ai didi

c++ - 如何让带有 QSqlTableModel 的 QTableView 具有复选框和多行?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:46:15 24 4
gpt4 key购买 nike

我需要使用 QSqlTableModel 呈现项目的 QTableView 在列中包含复选框,并在其他列中包含多行文本编辑,因为当用户按下时我需要换行输入按钮。这是很多东西,但如果我能在表格中找到复选框,我就可以完成其余的事情。

我试过了this ,但它不适用于应用程序崩溃。

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

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

最佳答案

您可以像这样为您的复选框创建一个自定义委托(delegate):

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

接下来在您的代码中将您的自定义项目委托(delegate)分配给所需的列:

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

关于c++ - 如何让带有 QSqlTableModel 的 QTableView 具有复选框和多行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21498857/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com