从 QML TableView 委托调用 QSqlTableModel.setData

问题描述 投票:0回答:1

我的任务是使用 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 才会保存更改。

我做错了什么?

python sql qt qml
1个回答
0
投票

要从 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 中数据库支持的模型实现更强大的功能。

© www.soinside.com 2019 - 2024. All rights reserved.