我的任务是使用 QML 模板为 QSqlTableModel 创建可编辑的 Qtableview。
这是qml模板的一部分:
TableView {
model: myModel
delegate: Rectangle {
TextInput {
id: txt
text: display
onEditingFinished: {
display = text
}
}
}
这是一个模型:
class customQSqlTableModel(QSqlTableModel):
def __init__(self, db):
super().__init__(db = db)
self.setTable('main')
self.setEditStrategy(QSqlTableModel.EditStrategy.OnRowChange)
self.select()
self.setHeaderData(0, PySide6.QtCore.Qt.Orientation.Horizontal ,'descr')
self.setHeaderData(1, PySide6.QtCore.Qt.Orientation.Horizontal, 'price')
def setData(self, index, value, role):
if super().setData(index, value, Qt.ItemDataRole.EditRole):
res = self.submit()
if res == True:
return True
return False
def flags(self, index) -> PySide6.QtCore.Qt.ItemFlag:
return PySide6.QtCore.Qt.ItemFlag.ItemIsSelectable|PySide6.QtCore.Qt.ItemFlag.ItemIsEnabled|PySide6.QtCore.Qt.ItemFlag.ItemIsEditable
qml 引擎使用 role = Qt.ItemDataRole.DisplayRole 调用我的 customQSqlTableModel.setData 方法 因此,仅当我在调用超级方法时将角色重新定义为 EditRole 时,setData 才会保存更改。
我做错了什么?
要从 QML
QSqlTableModel.setData
委托调用 TableView
函数,您可以利用 model
的 TableView
属性和委托的 index
属性。以下是如何实现此目标的示例:
import QtQuick 2.0
import QtQuick.Controls 2.0
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.3
import QtQuick.Window 2.15
ApplicationWindow {
visible: true
width: 400
height: 300
TableView {
id: tableView
anchors.fill: parent
model: QSqlTableModel {
id: sqlModel
tableName: "your_table_name"
// Set up your database connection and other necessary properties
}
delegate: Item {
width: tableView.columnWidthProvider(column)
height: tableView.rowHeightProvider(row)
TextField {
id: textField
anchors.fill: parent
text: styleData.value !== undefined ? styleData.value.toString() : ""
onTextChanged: {
// Get the corresponding QModelIndex
var index = tableView.model.index(styleData.row, styleData.column)
// Call the setData function to update the data in the model
tableView.model.setData(index, textField.text)
}
}
}
// Populate the table with data
onVisibleChanged: {
if (visible) {
sqlModel.select()
}
}
}
}
在上面的示例中,我们有一个
TableView
,并以 QSqlTableModel
作为其模型。 TableView
的委托是一个包含 Item
的 TextField
。当 TextField
中的文本发生变化时,onTextChanged
信号被触发。在信号处理程序内部,我们使用 QModelIndex
和 styleData.row
属性检索相应的 styleData.column
。然后,我们调用 setData
的 QSqlTableModel
函数,用 TextField
中的新文本更新模型中的数据。
确保设置数据库连接和
QSqlTableModel
的其他必要属性,以确保为您的特定数据库正确配置。
注意:
QSqlTableModel
是Qt Widgets模块的一部分,直接在QML中使用它需要额外的设置和集成。您可能需要使用 Qt 的 C++ API 创建自定义模型并将其公开给 QML,以通过 QML 中数据库支持的模型实现更强大的功能。