QTableView 中的 Qt 复选框

Posted

技术标签:

【中文标题】QTableView 中的 Qt 复选框【英文标题】:Qt checkboxes in QTableView 【发布时间】:2016-02-10 02:25:14 【问题描述】:

我正在使用此代码查询 sqlite 并将结果放在 QTableView 中。

//MainWindow.cpp
void MainWindow::on_pushButton_clicked()

    QSqlQueryModel * modal=new QSqlQueryModel();
    connOpen();
    QSqlQuery* qry=new QSqlQuery(mydb);

    qry->prepare("select * from database");
    qry->exec();

    modal->setQuery(*qry);

    //from stack
    modal->insertColumn(0);

    ui->tableView->setModel(modal);

    //from stack
    ui->tableView->resizeColumnsToContents();

    int p;
    for(p=0; p<modal->rowCount(); p++)
    
        ui->tableView->setIndexWidget(modal->index(p,0),new QCheckBox());
    

    connClose();
    qDebug() <<(modal->rowCount());

我已经看到了几个用于向列添加复选框的网络示例,但我不太确定在我的简单示例中使用什么。

这个answer 提出了一些看起来不标准的行。 还有更多示例,例如 this 和 this one,它们似乎概述了我需要什么,但不清楚您将代码放在哪里。

我打算做的是检查第 1 列。在下一次按下 btn 时,如果选中这些数据行,则会将其写入文件。

我仍然需要了解如何遍历所选数据,或者我可能需要获取检查行的 ID 并执行另一个查询。

问题:

如何在 QTableView 中添加 1 列可编辑复选框? 如何循环访问 QTableView 数据中的值,以便可以访问选中行的值? 如何检查全部/无?

【问题讨论】:

【参考方案1】:

我认为拥有一列可检查单元格的最佳方法是创建您的项目模型,例如通过继承QSqlQueryModel。 您必须重新实现 flags() 方法以使单元格可检查。

您还需要重新实现data() 方法以返回检查状态和setData() 方法并设置检查状态。您必须实现自己的逻辑来跟踪每一行的检查状态(例如,使用 Qt::CheckState 数组,您必须在模型数据更改时对其进行初始化和调整大小)。

你可以这样开始:

class MyModel : public QSqlQueryModel

public:

    Qt::ItemFlags flags(const QModelIndex & index) const
    
        if(index.column() == 0)
             return QSqlQueryModel::flags(index) | Qt::ItemIsUserCheckable;
        return QSqlQueryModel::flags(index);
    

    QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const 
    
        if(index.column() == 0 && role == Qt::CheckStateRole)
        
            //implement your logic to return the check state 
            //....
        
        else
            return QSqlQueryModel::data(index, role);
    

    bool setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole)
    
        if(index.column() == 0 && role == Qt::CheckStateRole)
        
            //implement your logic to set the check state 
            //....
        
        else
            QSqlQueryModel::setData(index, value, role);
    
;

还有:

Model Subclassing QAbstractItemModel documentation

【讨论】:

你可以把它放在你想要的任何地方,它在你的 MainWindow.cpp 中可见就足够了。如果你不熟悉类的定义和头文件的使用,或许你应该多了解一下 C++。此外,这只是一个开始的代码示例,它并不完整。显然,您必须在 MainWindow.cpp 中使用 MyModel 而不是 QSqlQueryModel

以上是关于QTableView 中的 Qt 复选框的主要内容,如果未能解决你的问题,请参考以下文章

QTableView 中标题单元格中的复选框

Qt QTableView 表格内添加控件

QT QTableView 获取检查项目

在 QTableView 中嵌入控件?

可编辑 QTableView 中的 Pandas df:删除复选框

Qt中的QTableView 中的列放入Widget