QTableView

时间:2016-02-10 02:25:14

标签: c++ qt checkbox

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

我已经看过几个用于向列中添加复选框的Web示例,但我不太清楚我的简单示例使用了什么。

  • 这个answer表示一些似乎不标准的行。
  • 还有更多示例,例如thisthis one,这些示例似乎概述了我需要的内容,但不清楚您放置代码的位置。

我打算做的是让第1列可以检查。在下一次按btn按,如果选中,那些数据行将写入文件。

我仍然需要了解如何循环选择的数据,或者我需要获取已检查行的ID并执行另一个查询。

问题:

  • 如何向QTableView添加1列可编辑复选框?
  • 如何循环访问QTableView数据中的值,以便可以访问已检查行的值?
  • 如何检查所有/无?

1 个答案:

答案 0 :(得分:2)

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

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

Yuo可以从这样的事情开始:

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

Se还: