正确设置QStackedWidget,信号无法看到函数

2024-09-30 08:32:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用PyQt5开发一个GUI。我要教自己的第一步。我很难理解类何时继承方法/属性等,以及它们有哪些可用的方法——我想这是一个与范围相关的问题?我已经制作了一个MWE到我的图形用户界面下面。会有更多的页面。在

我想要的:

堆栈应该初始化为显示“MainMenu”小部件/对象(左图)。点击“下一页”按钮可以切换堆栈顺序,将“OtherPage”小部件/对象放在顶部(下图右侧)。我把每一页都作为一个类创建,认为这将是一个组织我的项目的好方法。这种做法是好是坏?在

MainMenuOtherPage

现在发生了什么:

如果nextPg.clicked.connect(self.drawOtherPage())行被注释掉,GUI就会工作(初始化),但是当然,单击按钮什么也不做。我可以切换初始的堆栈顺序,这样“other”小部件位于堆栈的顶部,它可以很好地显示出来,所以我认为这个类也可以工作。当代码中包含上述行时,将引发以下错误:

in __init__
     nextPg.clicked.connect(self.drawOtherPage())
AttributeError: 'MainMenu' object has no attribute 'drawOtherPage'

我所做的一切

我认为对super()的调用应该允许子类(在本例中是MainMenu)从父类(RootInit)继承方法。因此,我认为这应该使drawOtherPage方法可用于button connect信号。很明显,误差是由于该方法不可用造成的。在

我做错什么了?我应该在方法中创建这些“页面”小部件吗?它们需要在RootInit类下还是可以位于.py文件的顶层?我正在努力遵循最佳实践,因为项目最终会变得相当大。幸运的是,它的大部分应该是根据点击了什么按钮而变化的页面——因此我认为类是有帮助的。请严厉对待代码和我的python/PyQt语言,努力学习——谢谢!在

^{pr2}$

Tags: 项目对象方法self顺序堆栈部件connect
1条回答
网友
1楼 · 发布于 2024-09-30 08:32:20

您的代码有以下错误:

  • 变量self引用了该类的同一个实例,在您的例子中,self引用了MainMenu的一个实例,如果我们观察到MainMenu它没有任何{}方法。

  • 另一个错误是调用父级构造函数两次:


class MainMenu(QWidget):
    # class for main menu
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        super().__init__()

在第一个构造函数中,您指定了一个父级,而在第二个构造函数中,则没有。为了在python中澄清,有几种方法可以调用父级的构造函数:

^{pr2}$

所以你应该只使用其中一个。在

  • 另一个错误是信号是通过函数名连接的,不能用括号计算函数

  • 对于涉及多个对象的函数或方法的最后一次使用应该在两个对象都可以访问的地方完成,在您的例子中,您可以利用作为MainMenu:self.main = MainMenu(self)的父对象{},并通过方法parent()访问到该元素的连接。

上述所有操作都需要将MainMenu类修改为以下内容:

class MainMenu(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)

        mainLayout = QGridLayout() # layout for entire main menu
        quitBtn = QPushButton("Quit")
        quitBtn.clicked.connect(QtCore.QCoreApplication.instance().quit)
        nextPg = QPushButton("Next page")
        nextPg.clicked.connect(self.parent().drawOtherPage)

        mainLayout.addWidget(quitBtn, 0, 0)
        mainLayout.addWidget(nextPg, 0, 1)
        self.setLayout(mainLayout)

相关问题 更多 >

    热门问题