为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

UYOU 2021-03-05 11:08:05
在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?
查看完整描述

3 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

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()

但是出于我的价值,我不记得在函数定义中创建索引实例有麻烦,而且我已经在很多场合这样做了。


查看完整回答
反对 回复 2021-03-30
?
弑天下

TA贡献1818条经验 获得超8个赞

首先,按我的方式做的原因:

  1. 要求是insertRows“如果未指定parent,则每次调用时都要实例化一个新的QModelIndex”。

  2. Python仅为关键字参数分配一个默认值-不会在每次调用时分配默认值。

所以这是我的解决方案:

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

    index = index or QtCore.QModelIndex()

    # do other stuff


查看完整回答
反对 回复 2021-03-30
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

这是我在程序中添加开始和结束的方式:


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

  self.beginInsertRows(index, row, count)

  """ Your stuff here




  """

  self.endInsertRows()

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




查看完整回答
反对 回复 2021-03-30
  • 3 回答
  • 0 关注
  • 213 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信