PyQt5如何在一个窗口中显示不同的页面?

Posted

技术标签:

【中文标题】PyQt5如何在一个窗口中显示不同的页面?【英文标题】:How can I show different pages in one window by PyQt5? 【发布时间】:2017-10-02 16:25:21 【问题描述】:

如您所见,我创建了一个带有左按钮的窗口,但我不知道如何使用 QStackedWidget 在按下每个按钮后显示不同的视图。我搜索了几个类似的问题,但它们对我没有用。我是 PyQt5 的新手。我在下面添加我的代码,请看一下。

这是我的代码:

class StackedWidget(QStackedWidget):
    def __init__(self, parent = None):
        QStackedWidget.__init__(self, parent)

    def setCurrentIndex(self, index):
        QStackedWidget.setCurrentIndex(self, index)

    def setSend(self):
        self.setCurrentIndex(0)

    def setHome(self):
        self.setCurrentIndex(1)

class Homewindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowFlags(Qt.FramelessWindowHint)
        self.style = """
                QPushButton
                    background-color:rgba(0,0,0,20);
                
                QPushButton:hover 
                    background-color: rgba(0,0,0,40);
                    color: white;
                
            """
        self.setStyleSheet(self.style)
        self.initUI()

    def initUI(self):
        self.setGeometry(300,100,804,634)
        self.setWindowTitle('Home')

        self.stack = StackedWidget()

        page1 = QLabel("Page1")
        self.stack.addWidget(page1)

        email = QLabel("Page2")
        self.stack.addWidget(email)

        titleBarLbl = QLabel(self)
        titleBarLbl.setStyleSheet("background-color:blue")
        titleBarLbl.resize(805,53)

        self.sendBtn = QPushButton(self)
        self.sendBtn.setStyleSheet("background-color:red")
        self.sendBtn.clicked.connect(self.stack.setSend)
        self.sendBtn.setGeometry(0,53,48,48)

        self.homeBtn = QPushButton(self)
        self.homeBtn.setStyleSheet("background-color:green")
        self.homeBtn.clicked.connect(self.stack.setHome)
        self.homeBtn.setGeometry(0,101,48,48)

        self.show()

    def mousePressEvent(self,event):
        if event.button() == Qt.LeftButton:
            self.moving = True;
            self.offset = event.pos()

    def mouseMoveEvent(self,event):
        if self.moving:
            self.move(event.globalPos()-self.offset)

【问题讨论】:

这个方法我用过,但是没用。 【参考方案1】:

您问题中的代码似乎可以正常工作,只是您没有为堆栈小部件提供父级或设置其几何形状。所以只要做这样的事情:

def initUI(self):
    ...
    self.stack = StackedWidget(self)
    self.stack.setGeometry(55, 0, 750, 600)

使用按钮更改堆栈小部件中页面的通用方法是使用QButtonGroup。每个按钮都可以链接到堆栈小部件中给定页面的索引。那么可以使用button-group的buttonClicked信号改变页面:

self.group = QtWidgets.QButtonGroup(self)
self.group.addButton(self.buttonA, 0)
self.group.addButton(self.buttonB, 1)
self.group.addButton(self.buttonC, 2)
# etc
self.group.buttonClicked[int].connect(self.stack.setCurrentIndex)

如果需要,可以这样获取页面在stack-widget中的索引:

index = self.stack.indexOf(self.pageA)

【讨论】:

其实我用过这个方法,但是这样我就不能自定义按钮的样式了。 @J.mox。我添加了一个不同的示例,它使用单独的按钮来更改页面。 不,我不是那个意思。我想自己设置按钮的位置和样式,而不是使用 QGridLayout。如果我使用“layout.addWidget(self.nextPage, 1, 0)”,界面会坏掉。 @J.mox。您问如何使用按钮来更改堆栈小部件的页面,这就是我所做的。我显然不知道你的真实代码是什么样子的,所以我只是做了一个简单的演示。你解决不了的问题到底是什么? @J.mox。我添加了一个更通用的方法,它应该适用于您的代码。

以上是关于PyQt5如何在一个窗口中显示不同的页面?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用opencv在pyqt5中同时在不同窗口中运行一个网络摄像头

如何在pyqt5中的两个窗口之间传递参数?

具有多个意图的 PyQt5(同一窗口中的页面)

PyQt5,单击按钮后如何打开新窗口

如何从 PyQT5 窗口访问 PyQGIS 地图画布

如何在这个 pyqt5 窗口中使用 while 循环