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

时间:2013-06-06 08:59:27

标签: python qt pyqt

在Qt中,您在QAbstractItemModel

中有这个例程(以及其他例程)
bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex());

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

在python中,同一行的含义大不相同:每次调用只会实例化一个QModelIndex并分享

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

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

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

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

然后在索引为None的情况下实例化一个新的QModelIndex?

3 个答案:

答案 0 :(得分:1)

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 ++中,父参数作为const引用传递,因此不会被beginInsertRows函数删除或更改。

如果C ++实例在Python中仍被引用时被删除,可能会发生分段错误,这是我认为最大的问题。

现在在Python中,在函数定义中创建的参数通常具有较长的生命周期,并且可能存在实例被删除的方式我不知道但通常你应该安全。

如果您担心这一点,每次都只需创建新实例。

index = index or QtCore.QModelIndex()

但是对于它的价值我不记得在函数定义中创建索引实例时遇到了麻烦,我已经多次这样做了。

答案 1 :(得分:0)

这是我在我的程序中完成它的方式,添加了开头和结尾:

def insertRows(self, row, count, index): 
  self.beginInsertRows(index, row, count)
  """ Your stuff here



  """
  self.endInsertRows()

同时查看pyside docs,因为它们通常比pyqt更好,并且在LGPL之下,因此您可以将其用于商务。 IIRC是相同的结果,但在不同的许可下实施不同。

答案 2 :(得分:0)

首先,我的理由是这样做的:

  1. 要求是调用insertRows“每次调用时都会实例化一个新的QModelIndex,如果未指定parent”。
  2. Python只为关键字参数分配一次默认值 - 而不是每次调用。
  3. 所以这是我的解决方案:

    def insertRows(self, row, count, index=None):
        index = index or QtCore.QModelIndex()
        # do other stuff