繁体   English   中英

QTableView 中的 Qt 复选框

[英]Qt checkboxes in QTableView

我正在使用此代码查询 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 列可检查。 在下一次 btn 按下时,如果选中这些数据行将写入文件。

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

问题:

  • 如何向 QTableView 添加 1 列可编辑复选框?
  • 如何遍历 QTableView 数据中的值,以便可以访问选中行的值?
  • 你如何检查全部/无?

我认为拥有一列可检查单元格的最佳方法是创建您的项目模型,例如通过子类化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);
    }
};

也:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM