如何使我的QTableView与QSqlTableModel具备复选框和多行功能?

4
我需要我的QTableView使用QSqlTableModel呈现项目,并在一列中具有复选框,在其他列中具有多行文本编辑器,因为我需要用户按Enter键时换行。这是很多东西,但如果我可以在表格中得到复选框,我就可以处理其他部分。
我尝试过这个,但它不起作用,应用程序会崩溃。 此处的问题有一个答案,但它也无法帮助,因为它们使用QStandardItemModel,而我严格需要使用QSqlTableModel
如何在仍然使用QSqlTableModel的情况下完成复选框部分?
1个回答

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

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

#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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接