【问题标题】:Subclass & override PySide2 widget method; where do I find source to reference?子类化并覆盖 PySide2 小部件方法;我在哪里可以找到参考资料?
【发布时间】: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++ 中?

【问题讨论】:

    标签: python python-3.x pyside2


    【解决方案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 中完成,除了一些可以在一个中完成而不在另一个中完成的小事情。

    【讨论】:

      猜你喜欢
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-10
      相关资源
      最近更新 更多