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

Python pyqt中如何处理默认参数?,python,qt,pyqt,Python,Qt,Pyqt,在Qt中,在qabstractemmodel中有这个例程(以及其他例程) bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()); 它基本上在每次调用新的QModelIndex时实例化一个新的QModelIndex(如果未指定父对象) 在python中,同一行的含义大不相同:每次调用只实例化和共享一个QModelIndex 我不清楚的一点是PyQt如何处理这种差异。这似乎是从C++中自

在Qt中,在qabstractemmodel中有这个例程(以及其他例程)

bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex());
它基本上在每次调用新的QModelIndex时实例化一个新的QModelIndex(如果未指定父对象)

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

我不清楚的一点是PyQt如何处理这种差异。这似乎是从C++中自动生成的,默认参数实例化使用相同的语法,但是含义完全不同,使问题没有得到解决。 这个问题当然会在QabstracteModel的PyQt中进行自定义重新实现。你应该申报吗

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


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

这是我在程序中执行此操作的方式,添加了begin和end:

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



  """
  self.endInsertRows()

还可以查看,因为它们通常比pyqt做得更好,并且位于LGPL之下,因此您可以将其用于商业用途。IIRC这是相同的结果,但在不同的许可证下实现不同。

首先,我这样做的原因:

  • 要求是调用
    insertRows
    “在未指定父项的情况下,每次调用新的QModelIndex时都会实例化它”
  • Python只为关键字参数指定一个默认值一次,而不是每次调用
  • 因此,我的解决方案如下:

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

    这两个示例都会导致索引实例无效

    什么是病人? 可以使用QModelIndex构造无效的模型索引 构造器。无效索引通常在以下情况下用作父索引: 指模型中的顶级项

    每次调用时是否需要一个新的无效实例? 对于函数,基类实现 此函数的值不执行任何操作并返回false

    引用的意思是,如果您使用
    qabstractemmodel
    ,您需要自己实现
    insertRows
    。 这意味着您需要调用接受父参数的

    <强>当涉及父索引时,Qt的C++侧将不关心给定的实例>。只要它是无效的,就意味着当前项位于模型的顶层,并且没有父项

    qabstractemmodel
    不应删除它自己未创建的任何索引。 在C++中,父参数被传递为<代码> const 参考,因此不会被删除或更改为<代码>p>

    如果在Python中引用C++实例,删除的故障可能是您最大的问题。 现在在Python中,在函数定义中创建的参数通常会有很长的生命周期,可能会有我不知道的删除实例的方法,但通常应该是安全的。

    如果您对此感到担忧,只需每次创建新实例即可


    但是值得一提的是,我不记得在函数定义中创建索引实例时遇到过问题,而且我已经多次这样做了。

    如果您使用
    QModelIndex()
    作为默认参数,您可以使用
    isValid()
    方法,如果您使用
    None
    您必须检查无,然后
    isValid()
    方法,因此我建议使用
    QModelIndex
    实例作为默认值。据我所知,这是唯一的区别。@rebus,据我所知,要求是:如果未传递
    parent
    的实际参数,则为
    QModelIndex
    分配新实例-不要使用现有实例@斯蒂法诺,我说得对吗?
    def insertRows(self, row, count, index=None):
        index = index or QtCore.QModelIndex()
        # do other stuff
    
    bool insertRows(int row, int count, 
                    const QModelIndex &parent = QModelIndex());
    
    def insertRows(self, row, count, index=QtCore.QModelIndex()):