数据库中的“锁定”列包含 int 值“0”或“2”的项目。 在 QTableWidget 中,所有“锁定”项目都显示为复选框及其正确值: ...
lockedItem = new QTableWidgetItem(col2);
//...
// Loop ...
if (lockedItem->text() == "0") {
lockedItem->setCheckState(Qt::Unchecked);
} else if (lockedItem->text() == "2") {
lockedItem->setCheckState(Qt::Checked);
}
ui->tableWidget->setItem(i,2,lockedItem);
//...
ui->tableWidget->show();
tableModel = ui->tableWidget->model();
connect(tableModel, SIGNAL(dataChanged ( const QModelIndex &, const QModelIndex & )),
this, SLOT(lockedItemChanged( QModelIndex )));
<小时/>
每当我切换复选框时,就会调用以下插槽:
void MainWindow::lockedItemChanged(QModelIndex itemIndex)
{
int row = itemIndex.row();
int col = itemIndex.column();
QVariant value = ui->tableWidget->item(row, col)->checkState();
ui->tableWidget->item(row,col)->setData(Qt::EditRole, value);
qDebug() << "item changed at: (" << row << "," << col <<")"<< value;
}
<小时/>
在 QtableWidget 中,一切看起来都很好,我看到每个复选框旁边都显示了正确的值。例如,如果我选中“锁定”列中的一个框,则其旁边会显示“2”,如果取消选中,则会显示“0”。但是如何将这些(选中/取消选中或“0”和“2”)更改提交回 MYSQL 数据库? 我缺少什么?我认为 setData 应该做到这一点。
最佳答案
您的问题中缺少很多信息。但要回答您在评论中的问题:
QTableWidget
,与QTreeWidget
和QListWidget
相同,自带自己的模型。该内部模型不应该从外部更改,而是您可以使用 QTableWidget
提供的公共(public)函数和信号。
对于简单的数据库交互,像您一样连接到 dataChanged()
信号就足够了。但是当你打电话时
ui->tableWidget->item(row,col)->setData(Qt::EditRole, value);
您基本上使用刚刚检索到的相同数据覆盖模型中的数据。
相反,您应该将更改应用到数据库,如下所示:
myDatabase->updateLockedState(row, col, value);
如果您想在数据库和 GUI 表之间直接映射,您应该子类化 QSqlTableModel
(或者创建您自己的 QAbstractItemModel
派生模型,该模型具有 QSqlDatabase
作为成员)并将其设置为 QTableView
的模型。
关于mysql - QTableWidget 有一个包含可检查项目的列,但我无法将复选框的切换提交给 MYSQL db,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37424266/