子类化并覆盖 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 小部件方法;我在哪里可以找到参考资料?的主要内容,如果未能解决你的问题,请参考以下文章

PySide2 复合小部件悬停效果

在 PyQt5/Pyside2 中动态添加小部件到流布局

简单的 Qt 小部件来绘制线条和形状(如 tkinter 画布)?

我在 Pycharm 中使用 PySide2 来构建我的 GUI 程序,但是在哪里可以找到参考文档?

PyQt5 制作子类小部件

在 QWidget 上绘画以覆盖整个小部件