子类化并覆盖 PySide2 小部件方法;我在哪里可以找到参考资料?
Posted
技术标签:
【中文标题】子类化并覆盖 PySide2 小部件方法;我在哪里可以找到参考资料?【英文标题】:Subclass & override PySide2 widget method; where do I find source to reference? 【发布时间】:2019-08-21 00:26:10 【问题描述】:当继承一个类并覆盖一个方法时,您并不总是知道原始类中的内容。如果我理解正确的话,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++ 中?
【问题讨论】:
【参考方案1】: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,所以如果你想理解逻辑,分析类的源代码是不够的,公共 API 很少改变它,而是私有 API不断变化。
总之,如果您想添加功能,那么只需分析文档即可,因为即使代码发生更改也是如此。了解其工作原理的另一种方法是修改和分析 GUI 中发生的变化。
PyQt/Qt For Python 所做的是一个处理 C++ 类的包装器,所以通常可以在 C++ 中完成的事情可以在 Python 中完成,除了一些可以在一个中完成而不在另一个中完成的小事情。
【讨论】:
以上是关于子类化并覆盖 PySide2 小部件方法;我在哪里可以找到参考资料?的主要内容,如果未能解决你的问题,请参考以下文章
简单的 Qt 小部件来绘制线条和形状(如 tkinter 画布)?