gpt4 book ai didi

python - 子类化并重写 PySide2 小部件方法;我在哪里可以找到引用资料?

转载 作者:太空宇宙 更新时间:2023-11-03 20:29:45 25 4
gpt4 key购买 nike

当继承一个类并重写一个方法时,您并不总是知道原始类内部有什么。如果我理解正确的话,Python 中处理此问题的各个方面都是有意设计来适应这一点的。但我必须认为所有或大部分 Qt 代码都记录在某处。我发现 Qt for Python 文档令人耳目一新(与 PyQt 相比),并以相当多的细节列出了类的所有方法,但我无法找到特定方法的实际代码,并且描述并不总是非常完整。例如,考虑我是否想覆盖组合框的 mousePressEvent。

class mycombo(QtWidgets.QComboBox):
def __init__(self, parent = None):
super(mycombo, self).__init__()
self.setAcceptDrops(True)
self.setFocusPolicy(QtCore.Qt.NoFocus)

def mousePressEvent(self,event):

在 Qt for Python 文档中,我看到 QComboBox 继承自 QWidget其中有关于 mousePressEvent 的说法:

https://doc.qt.io/qtforpython/PySide2/QtWidgets/QWidget.html#PySide2.QtWidgets.PySide2.QtWidgets.QWidget.mousePressEvent

那里写了一些有用的东西,但是,我如何确定“原始”mousePressEvent 中实际发生的情况?我不想干扰实际需要的操作的其他部分。在这种情况下,也许需要像描述中提到的那样处理弹出窗口小部件。但我也可能不想超越原来的方法。是否还有更多我错过的文档?似乎有些小部件是在 Python 中进行子类化和修改的,而其他小部件仅在 C++ 中?

最佳答案

TL;博士;没有文档或需要,因为源代码可以在不通知开发人员的情况下进行更改。

<小时/>

实际上,您不应该知道每个方法的作用,因为这可能会在新版本中发生变化。如果您的目标是添加功能,那么不要通过调用 super().foo_method() 来覆盖父类的实现,这样您就可以在原始实现之前或之后添加逻辑

class MyCombo(QtWidgets.QComboBox):
def __init__(self, parent = None):
super(MyCombo, self).__init__(parent)
self.setAcceptDrops(True)
self.setFocusPolicy(QtCore.Qt.NoFocus)

def mousePressEvent(self,event):
# stuff
super(MyCombo, self).mousePressEvent(event)
# another stuff

如果您仍然想知道该函数中发生了什么,那么您应该检查 source code :

void QComboBox::mousePressEvent(QMouseEvent *e)
{
Q_D(QComboBox);
if (!QGuiApplication::styleHints()->setFocusOnTouchRelease())
d->showPopupFromMouseEvent(e);
}

Qt 有 2 种类型的 API,因为它实现了 PIMPL/D-Pointer所以如果你想了解逻辑,仅仅分析类的源代码是不够的,公共(public)API很少改变它的本质,但私有(private)API却不断变化。

总之,如果您想添加功能,那么只需分析文档即可,因为即使代码发生更改,也会尊重这一点。了解其工作原理的另一种方法是修改和分析 GUI 中发生的更改。

PyQt/Qt For Python 所做的是处理 C++ 类的包装器,因此一般来说,在 C++ 中可以完成的事情都可以在 Python 中完成,除了一些可以在一个类中完成而不能在另一个类中完成的小事情。

关于python - 子类化并重写 PySide2 小部件方法;我在哪里可以找到引用资料?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57583005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com