首先感谢您的宝贵时间,对问题的长度也表示歉意,真正的问题只是第一部分。 我无法理解ho如何实现“页面”更改,例如Web应用程序。 我想使用代表小部件或主窗口的.ui文件来完成此操作。 基本上,我希望有两个类,每个类都映射有一个实现视图的.ui文件,并在单击按钮时在两个视图之间切换。
我想拥有这样的东西:
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
# then load the home page file home.ui
class HomePage:
def method_0(self):
# method to load and show the home.ui file, at startup
def method_1(self):
# method to load and show the home.ui file, when a button in Second Page is pressed
class SecondPage
def method_1(self):
# method to load and show the second.ui file when a button in HomePage is pressed
if __name__ == '__main__':
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
经过大量研究,我在下面编写了几乎意识到这一点的代码,我之所以这样说,几乎是因为我必须对所有人使用相同的类。相反,我想要的是每个.ui文件都有一个.py文件,以保持分隔。
from PyQt5 import uic
from PyQt5.QtWidgets import QApplication, QMainWindow, QStackedWidget
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.resize(800, 620)
self.central_widget = QStackedWidget()
self.setCentralWidget(self.central_widget)
self.home_page()
def home_page(self):
widget = uic.loadUi('home.ui')
self.central_widget.addWidget(widget)
self.central_widget.setCurrentWidget(widget)
widget.change_btn.clicked.connect(self.second_page)
def second_page(self):
widget = uic.loadUi('second.ui')
self.central_widget.addWidget(widget)
self.central_widget.setCurrentWidget(widget)
widget.change_btn.clicked.connect(self.home_page)
if __name__ == '__main__':
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
这是两个.ui文件的代码,只需将文件名更改为home.ui
和second.ui
,然后更改btn文本以查看页面更改。它们是简单的小部件,每个小部件只有一个按钮
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>620</height>
</rect>
</property>
<property name="windowTitle">
<string>Application</string>
</property>
<widget class="QWidget" name="centralwidget">
<property name="title" stdset="0">
<string>GroupBox</string>
</property>
<widget class="QPushButton" name="change_btn">
<property name="geometry">
<rect>
<x>285</x>
<y>170</y>
<width>230</width>
<height>40</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
<string>Change page</string>
</property>
</widget>
</widget>
<widget class="QStatusBar" name="statusbar"/>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>26</height>
</rect>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>
答案 0 :(得分:2)
您需要做的是创建单独的 widgets (不是Windows)。尽管其他类似问题(例如this)已经解决了这一问题,但由于文件请求不同,我还是会回答。
使用QStackedWidget的解决方案仍然是相同的,它允许您在占据窗口同一部分的不同小部件之间进行切换,类似于QTabWidget所做的,但是没有选项卡栏。
首先,您需要在设计器中创建一个主窗口,在其中添加QStackedWidget并确保删除其页面的 all (右键单击堆叠的窗口小部件,然后在窗口中选择“删除” “ x的x页”子菜单。
然后为每个页面创建单独的小部件(只需在创建新表单时出现的对话框中选择“小部件”)即可。
最后,在主窗口和每个子窗口小部件上使用loadUi
。
我建议您将页面切换的逻辑保持在主窗口的代码中,而不是将其置于不同的页面中,因为在处理这种情况时,这是一种更好的方法,它具有“父”控制器。 / p>
pages.py:
from PyQt5 import uic
from PyQt5.QtWidgets import QApplication, QMainWindow
from first import First
from second import Second
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
uic.loadUi('pages.ui', self)
self.first = First()
self.stackedWidget.addWidget(self.first)
self.first.change_btn.clicked.connect(self.go_to_second)
self.second = Second()
self.stackedWidget.addWidget(self.second)
self.second.change_btn.clicked.connect(self.go_to_first)
def go_to_first(self):
self.stackedWidget.setCurrentIndex(0)
def go_to_second(self):
self.stackedWidget.setCurrentIndex(1)
if __name__ == '__main__':
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
first.py
from PyQt5 import uic
from PyQt5.QtWidgets import QWidget
class First(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
uic.loadUi('first.ui', self)
second.py
from PyQt5 import uic
from PyQt5.QtWidgets import QWidget
class Second(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
uic.loadUi('second.ui', self)
也可以使用QWizard,但是通常建议比您的情况更复杂。