Qt中QTableView中的复选框

4
我正在使用这段代码查询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());
}

我在网上看到了几个关于在列中添加复选框的例子,但是我不确定该使用什么来完成我的简单示例。

  • 这个答案建议使用几行代码,但似乎不太标准。
  • 还有更多类似这个这个的例子,它们似乎概述了我需要的内容,但不清楚在哪里放置代码。

我想做的是让第1列可以勾选。在下一次按钮按下时,如果选中了这些数据行,那么这些数据将被写入文件。

我仍然需要了解如何循环遍历所选数据,或者也许我需要获取已选行的ID并进行另一个查询。

问题:

  • 如何向QTableView添加1列可编辑复选框?
  • 如何循环遍历QTableView数据中的值,以便可以访问所选行的值?
  • 如何全选/取消选择?
1个回答

6
我认为创建一个可勾选单元格的列的最佳方法是通过创建您的项目模型,例如通过子类化。 您必须重新实现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);
    }
};

另请参阅:


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

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