Python 新手似乎无法正确继承 PyQt4 小部件

Python newbie can't seem to properly subclass a PyQt4 widget

我是一个 Python 新手,似乎无法在 PyQt4 中正确地子class 一个小部件。最初我创建了一个 QDockWidget 对象并将其添加到 MainWindow 中,如下所示:

from PyQt4.QtCore import *
from PyQt3.QtGui import *

class MainWindow(QMainWindow):

    def __init__(self, parent=NONE):
        toolWindow1 = QDockWidget("Tool Window 1", self)
        self.addDockWidget(Qt.LeftDockWidgetArea, toolWindow1)

效果很好。现在,我想 subclass QDockWidget。我创建一个名为 "ToolWindows.py" 的新文件并向其中添加以下 class:

from PyQt.QtCore import *
from PyQt4.QtGui import *

class BasicToolWindow(QDockWidget):

    def __init__(self, parent=NONE):
        super(BasicToolWindow, self).__init__(parent)

然后我尝试在 MainWindow 中创建它,如下所示:

toolWindow1 = BasicToolWindow("Tool Window 1", self)

这会在运行时导致以下错误:“init() 最多接受 2 个参数(给定 3 个)”。有人能解释一下我在这里做错了什么吗,有人能给我指点一下在线 subclassing 的一个很好的解释吗?我自己没有成功找到一个。谢谢!

def __init__(self, parent=NONE):

它只有 2 个参数。另外,当你这样做时

toolWindow1 = BasicToolWindow("Tool Window 1", self)

它将"self" 隐含地提供给参数。所以你剩下的只是你用 "Tool Window 1."

填充的父参数

基本上,您为 BasicToolWindow 提供了三个参数:self、"Tool Window 1" 和 self。这就是编译器不满意的原因。

QDockWidget class 有两个构造函数。一个取 titleparentflags,而另一个只取 parentflags。如果您想在创建 BasicToolWindow subclass 的实例时使用这些参数,您需要在其 __init__:

的签名中定义它们
class BasicToolWindow(QDockWidget):
    def __init__(self, title, parent=None):

parent 参数在 QDockWidget C++ 构造函数中是可选的,默认为 NULL(即没有 parent) - 所以添加了 parent=None 的 PyQt 等价物来匹配它。 flags 参数被省略,因为很少需要它,Qt 已经提供了默认值。

然后需要通过 super 将这些参数传递给 base-class __init__,以便 QDockWidget 构造函数获得它期望的参数:

class BasicToolWindow(QDockWidget):
    def __init__(self, title, parent=None):
        super(BasicToolWindow, self).__init__(title, parent)

现在,当您创建 BasicToolWindow 时,基础 dock-widget 的标题已设置,并且 main-window(即 self)成为其 parent:

toolWindow1 = BasicToolWindow("Tool Window 1", self)