我正在使用此代码查询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示例,但我不太清楚我的简单示例使用了什么。
我打算做的是让第1列可以检查。在下一次按btn按,如果选中,那些数据行将写入文件。
我仍然需要了解如何循环选择的数据,或者我需要获取已检查行的ID并执行另一个查询。
问题:
答案 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还: