我如何通过 PyQt5 在一个 window 中显示不同的页面?
How can I show different pages in one window by PyQt5?
如您所见,我创建了一个带有左键的 window,但我不知道如何使用 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)
你问题中的代码似乎工作正常,除了你没有给堆栈小部件一个父级,或者设置它的几何形状。所以就做这样的事情:
def initUI(self):
...
self.stack = StackedWidget(self)
self.stack.setGeometry(55, 0, 750, 600)
使用按钮更改堆栈小部件中页面的通用方法是使用 QButtonGroup。每个按钮都可以链接到堆栈小部件中给定页面的索引。然后按钮组的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)
如您所见,我创建了一个带有左键的 window,但我不知道如何使用 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)
你问题中的代码似乎工作正常,除了你没有给堆栈小部件一个父级,或者设置它的几何形状。所以就做这样的事情:
def initUI(self):
...
self.stack = StackedWidget(self)
self.stack.setGeometry(55, 0, 750, 600)
使用按钮更改堆栈小部件中页面的通用方法是使用 QButtonGroup。每个按钮都可以链接到堆栈小部件中给定页面的索引。然后按钮组的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)