[英]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 并执行另一个查询。
问题:
我认为拥有一列可检查单元格的最佳方法是创建您的项目模型,例如通过子类化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.