Można użyć modelu proxy, który będzie interpretował jakieś dane (np. "0" i "1") jako checkbox, np.
class MyProxy : public QIdentityProxyModel
{
public:
MyProxy(QObject* parent) : QIdentityProxyModel(parent) {}
QVariant data(const QModelIndex& index, int role) const override
{
if (role == Qt::CheckStateRole && index.column() == 0)
{
QString str_value = QIdentityProxyModel::data(index, Qt::DisplayRole).toString();
return (str_value == "1") ? Qt::Checked : Qt::Unchecked;
}
return QIdentityProxyModel::data(index, role);
}
bool setData(const QModelIndex& index, const QVariant& value, int role) override
{
if (role == Qt::CheckStateRole && index.column() == 0)
{
QString str_value = (value.toInt() == Qt::Checked) ? "1" : "0";
return QIdentityProxyModel::setData(index, str_value, Qt::EditRole);
}
else
return QIdentityProxyModel::setData(index, value, role);
}
Qt::ItemFlags flags(const QModelIndex& index) const override
{
Qt::ItemFlags f = QIdentityProxyModel::flags(index);
if (index.column() == 0)
f |= Qt::ItemIsUserCheckable;
return f;
}
};
oczywiście numer kolumny i dane rozpoznawane jako "zaznaczony" można sobie dostosować.
Takiego modelu można użyć potem tak:
QSqlTableModel* model = new QSqlTableModel(parent, database);
MyProxy* proxy = new MyProxy(parent);
proxy->setSourceModel(model);
tableView->setModel(proxy);