我使用Python3 + PyQt显示SQLite3数据库。我想通过点击一个按钮在QAbstractDataModel中添加项目,该按钮在新窗口中提供了一个表单。根据我的理解,这意味着我必须将信号(rowsInserted或dataChanged)传递给现有的数据模型类,或者在类中执行将为我发出信号的方法。我想知道这样做的正确方法是什么。
我尝试了两种方法,两种方法都不起作用,而且我认为这一切都感觉有点太糟糕了#84; hack-ish"就像我用错误的方法使用一个好工具一样。有人知道如何使用QT5将信号从对话框传递到抽象数据模型吗?
顺便说一下,如果你不熟悉PyQt,但是你知道怎么用C ++做,请告诉我!到现在为止,我很乐意翻译。以下是我尝试的几个片段:
在我的submitItem类中:
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.
这是我当前为renderData变量建模的dataModel类:
def refreshData(self, index, row):
self.rowsInserted.emit(index, row, row) #needs another argument
dataModel.rowsInserted.emit() #
self.dataChanged.emit(index, index)
感谢任何帮助,希望这个问题有道理!
答案 0 :(得分:1)
通常,您应该通过my_model.setData()
方法的实现来修改模型。您对此方法的实现应发出dataChanged()
信号,该信号需要绑定已更改数据的模型索引。
所以你需要咬紧牙关并创建一个或多个模型索引,这样你就可以发出期望作为参数的信号(你尝试发出这个信号,但是使用了明显失败的整数)。
要创建模型索引,我们访问c ++ docs :(对pyqt文档的Python开发更有用)
自定义模型需要为其他组件创建模型索引 使用。为此,请使用合适的行和列调用createIndex() 项目的数字,以及它的标识符,作为指针或 作为整数值。这些值的组合必须是唯一的 对于每个项目。
该页面上还有关于setData()
的实施以及何时/如何发出dataChanged()
的详细信息(参见“详细说明”和各个方法的详细信息)
您可能还想查看QSqlTableModel
,这可能会否定您需要实施自己的模型?