向 class 外部的抽象 table 模型发送信号

Send signal to abstract table model outside class

我正在使用 Python3 + PyQt 来显示 SQLite3 数据库。我想通过点击一个按钮将项目添加到 QAbstractDataModel,该按钮在新的 window 中给我一个表单。据我了解,这意味着我必须将一个信号(rowsInserted 或 dataChanged)传递给现有数据模型 class,或者在 class 中执行一个方法来为我发出信号.我想知道这样做的正确方法是什么。

我已经尝试了这两种方法,但都没有用,而且我觉得这一切都有些过分了 "hack-ish",就像我用错了一个很棒的工具。有人知道如何使用 QT5 将信号从对话框传递到抽象数据模型吗?

顺便说一句,如果您不熟悉 PyQt 但知道如何使用 C++ 来实现,请告诉我!到现在为止,我已经习惯了翻译。

这是我正在尝试的一些片段:

在我的 submitItem class:

renderData.append([name, eventType]) #changes the data
nrows=dataModel.rowCount(dataModel) #gives me the new row number
dataModel.dataChanged.emit(nrows) #Doesn't like integer (nrows)
# OR
dataModel.refreshData(nrows) # usually needs more arguments, or a QModelIndex to tell it where to refresh the data--it doesn't like just an integer like nrows.

这是在我的数据模型中 class 当前正在对 renderData 变量建模:

def refreshData(self, index, row):
        self.rowsInserted.emit(index, row, row) #needs another argument
        dataModel.rowsInserted.emit() #
        self.dataChanged.emit(index, index)

感谢任何帮助,希望问题有意义!

通常,您应该通过实施 my_model.setData() 方法来修改模型。此方法的实现应发出 dataChanged() 信号,该信号需要绑定已更改数据的模型索引。

所以你需要硬着头皮创建一个或多个模型索引,这样你就可以发出期望它作为参数的信号(你尝试发出这个信号但使用了一个显然失败的整数)。

要创建模型索引,我们访问 c++ docs:(对于 Python 开发比 pyqt 文档更有用)

Custom models need to create model indexes for other components to use. To do this, call createIndex() with suitable row and column numbers for the item, and an identifier for it, either as a pointer or as an integer value. The combination of these values must be unique for each item.

该页面上还有关于 setData() 和 when/how 的实现以发出 dataChanged() 的详细信息(参见 "detailed description" 和各个方法的详细信息)

您可能还想查看 QSqlTableModel 这可能不需要实施您自己的模型?