首先,我的解决方案的基础是推广小部件,为此我将按以下方式构建项目:
├── main.py
├── pages
│ ├── energypage.py
│ ├── fanpage.py
│ ├── homepage.py
│ └── statuspage.py
└── ui
├── energy.ui
├── fan.ui
├── home.ui
├── main.ui
└── status.ui
页面的 .ui 将基于 Widget 模板,但主页面将使用 MainWindow 模板(MainWindow 允许拥有 ToolBars、StatusBar、DockWidgets、menuBar 等,因此我选择它作为主页面)。
由于 .ui 本身无法升级,因此将创建调用设计并遵循类似结构的类,但您可以添加更多功能,例如 homepage.py 的情况:
import os
from PyQt4 import QtGui, uic
current_dir = os.path.dirname(os.path.abspath(__file__))
Form, Base = uic.loadUiType(os.path.join(current_dir, "../ui/home.ui"))
class HomeWidget(Base, Form):
def __init__(self, parent=None):
super(self.__class__, self).__init__(parent)
self.setupUi(self)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
w = HomeWidget()
w.show()
sys.exit(app.exec_())
main.ui 的左侧有按钮,右侧有 QStackedWidget:
通过选择选项“插入页面 -> 在右键单击 QStackedWidget 打开的菜单的当前页面之后”来添加每个页面
然后它将被提升为使用页面文件夹中的小部件:
然后主要将按钮与适当的索引相关联:
main.py
import os
from PyQt4 import QtGui, uic
from functools import partial
current_dir = os.path.dirname(os.path.abspath(__file__))
Form, Base = uic.loadUiType(os.path.join(current_dir, "ui/main.ui"))
class MainWidget(Base, Form):
def __init__(self, parent=None):
super(self.__class__, self).__init__(parent)
self.setupUi(self)
buttons = (self.homebutton, self.statusbutton, self.fanbutton, self.energybutton)
for i, button in enumerate(buttons):
button.clicked.connect(partial(self.stackedWidget.setCurrentIndex, i))
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
app.setStyle("fusion")
w = MainWidget()
w.show()
sys.exit(app.exec_())
完整的例子是here https://github.com/eyllanesc/stackoverflow/tree/master/questions/53899209.