如何在pyqt中处理默认参数?

在Qt中,您在QAbstractItemModel中具有此例程(以及其他例程)

bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex());

如果未指定parent,则每次调用它时都会实例化一个新的QModelIndex。

在python中,同一行的含义有很大不同:每次调用仅实例化和共享一个QModelIndex

我不清楚的一点是PyQt如何处理这种差异。该文档似乎是从C ++自动生成的,其结果是默认参数实例化使用相同的语法,但含义完全不同,从而使问题没有得到解决。

这个问题当然会在QAbstractItemModel的PyQt中进行自定义重新实现。你应该宣布

 def insertRows(self, row, count, index=QtCore.QModelIndex()):

或者

 def insertRows(self, row, count, index=None):

如果索引为None,则实例化一个新的QModelIndex?


UYOU
浏览 214回答 3
3回答

慕的地8271018

bool insertRows(int row, int count,                  const QModelIndex &parent = QModelIndex());和def insertRows(self, row, count, index=QtCore.QModelIndex()):这两个示例均导致无效的索引实例。什么是无效的QModelIndex?可以使用QModelIndex构造函数构造无效的模型索引。当引用模型中的顶级项目时,无效索引通常用作父索引。不insertRows每次被调用时,需要一个新的无效实例?对于insertRows函数,该函数的基类实现不执行任何操作,并返回false。引用意味着如果您使用它,则QAbstractItemModel需要实现insertRows自己。这意味着您需要调用带父参数的beginInsertRows。当涉及到父索引时,Qt的C ++端将不在乎给定哪个实例。只要它是无效的,就意味着当前项目在模型的顶层,并且没有父项。QAbstractItemModel不应删除它自身未创建的任何索引。在C ++中,parent参数作为const引用传递,因此不会被beginInsertRows函数删除或更改。我认为,如果C ++实例在仍被Python引用时被删除,则可能会发生分段错误,这是您最大的问题。现在在Python中,在函数定义中创建的参数通常具有较长的寿命,并且可能有一些我不知道的删除实例的方法,但是通常您应该是安全的。如果您对此感到担心,则只需每次都创建一个新实例。index =索引或QtCore.QModelIndex()但是出于我的价值,我不记得在函数定义中创建索引实例有麻烦,而且我已经在很多场合这样做了。

弑天下

首先,按我的方式做的原因:要求是insertRows“如果未指定parent,则每次调用时都要实例化一个新的QModelIndex”。Python仅为关键字参数分配一个默认值-不会在每次调用时分配默认值。所以这是我的解决方案:def insertRows(self, row, count, index=None):    index = index or QtCore.QModelIndex()    # do other stuff

慕哥9229398

这是我在程序中添加开始和结束的方式:def insertRows(self, row, count, index):   self.beginInsertRows(index, row, count)  """ Your stuff here  """  self.endInsertRows()还请查看pyside docs,因为它们通常比pyqt更好,并且在LGPL之下,因此您可以将其用于商务。IIRC的结果相同,但是在不同的许可证下实现不同。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python