Python pyqt中如何处理默认参数?
在Qt中,在qabstractemmodel中有这个例程(以及其他例程)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++中自
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时都会实例化它”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()):