【问题标题】:How are default arguments handled in pyqt?pyqt 中如何处理默认参数?
【发布时间】:2013-06-21 17:41:35
【问题描述】:

在 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?

【问题讨论】:

  • 如果你使用QModelIndex()作为默认参数,你可以使用isValid()方法,如果你使用None你必须检查无然后isValid()方法所以我推荐使用@987654329 @instance 作为默认值。据我所知,这是唯一的区别。
  • @rebus,据我了解,要求是:如果没有传递 parent 的实际参数,则分配 QModelIndex 的新实例 - 不要使用现有的实例。 @Stefano,我说的对吗?

标签: python qt pyqt


【解决方案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()

但我不记得在函数定义中创建索引实例时遇到过麻烦,而且我已经多次这样做了。

【讨论】:

    【解决方案2】:

    这就是我在程序中的做法,添加了开头和结尾:

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

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

    【讨论】:

      【解决方案3】:

      首先,按我的方式做事的理由:

      1. 要求是对insertRows 的调用“如果未指定父级,则每次调用时都会实例化一个新的 QModelIndex”。
      2. Python 只为关键字参数分配一个默认值 - 不是在每次调用时。

      所以这是我的解决方案:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-22
        • 1970-01-01
        相关资源
        最近更新 更多