stacked layout 实现按钮切换页面
实现按钮切换页面流程如下:
#创建按钮,连接功能
self.main_btn = QtWidgets.QToolButton(self.menubox)
self.main_btn.setText("主页")
self.main_btn.setObjectName("main_btn")
self.main_btn.setGeometry(QtCore.QRect(0,0,100,100))
self.main_btn.clicked.connect(Form.set_main_index)
self.main_btn.setAutoRaise(True)
self.label_btn = QtWidgets.QToolButton(self.menubox)
self.label_btn.setText("图片标注")
self.label_btn.setObjectName("label_btn")
self.label_btn.setGeometry(QtCore.QRect(100,0,100,100))
self.label_btn.clicked.connect(Form.set_label_index)
self.label_btn.setAutoRaise(True)
#创建一个stacked
self.stacked = QtWidgets.QStackedLayout(self.windowbox)
#创建子界面
self.main_frame = QtWidgets.QMainWindow()
self.label1 = QtWidgets.QLabel(self.main_frame)
self.label1.setGeometry(QtCore.QRect(0,0,100,20))
self.label1.setText("第一个界面")
self.label_frame = QtWidgets.QMainWindow()
self.label2 = QtWidgets.QLabel(self.label_frame)
self.label2.setGeometry(QtCore.QRect(0,0,100,20))
self.label2.setText("第二个界面")
#将子界面添加到stacked中
self.stacked.addWidget(self.main_frame)
self.stacked.addWidget(self.label_frame)
#页面跳转功能函数(我一般与界面分开两个类来写,所以需要用self.ui来调用窗口控件)
def set_main_index(self):
if self.ui.stacked.currentIndex() != 0:
self.ui.stacked.setCurrentIndex(0)
def set_label_index(self):
if self.ui.stacked.currentIndex() != 1:
self.ui.stacked.setCurrentIndex(1)
我写的一段完整代码:
from PyQt5 import QtCore,QtGui,QtWidgets,Qt
import sys
#界面
class Ui(object):
def setupUi(self,Form):
Form.setObjectName("Form")
Form.setWindowTitle("整合工具")
Form.resize(1920,1080)
#选单栏
self.menubox = QtWidgets.QGroupBox(Form)
self.menubox.setGeometry(QtCore.QRect(0,0,1920,100))
self.menubox.setObjectName("menubox")
#切页主页按钮
self.main_btn = QtWidgets.QToolButton(self.menubox)
self.main_btn.setText("主页")
self.main_btn.setObjectName("main_btn")
self.main_btn.setGeometry(QtCore.QRect(0,0,100,100))
self.main_btn.clicked.connect(Form.set_main_index)
self.main_btn.setAutoRaise(True)
#切页图片标注按钮
self.label_btn = QtWidgets.QToolButton(self.menubox)
self.label_btn.setText("图片标注")
self.label_btn.setObjectName("label_btn")
self.label_btn.setGeometry(QtCore.QRect(100,0,100,100))
self.label_btn.clicked.connect(Form.set_label_index)
self.label_btn.setAutoRaise(True)
#切页模型训练按钮
self.train_btn = QtWidgets.QToolButton(self.menubox)
self.train_btn.setText("模型训练")
self.train_btn.setObjectName("train_btn")
self.train_btn.setGeometry(QtCore.QRect(200,0,100,100))
self.train_btn.clicked.connect(Form.set_train_index)
self.train_btn.setAutoRaise(True)
#切页图像识别按钮
self.dist_btn = QtWidgets.QToolButton(self.menubox)
self.dist_btn.setText("图像识别")
self.dist_btn.setObjectName("dist_btn")
self.dist_btn.setGeometry(QtCore.QRect(300,0,100,100))
self.dist_btn.clicked.connect(Form.set_dist_index)
self.dist_btn.setAutoRaise(True)
#切页相机设置按钮
self.camera_btn = QtWidgets.QToolButton(self.menubox)
self.camera_btn.setText("相机设置")
self.camera_btn.setObjectName("camera_btn")
self.camera_btn.setGeometry(QtCore.QRect(400,0,100,100))
self.camera_btn.clicked.connect(Form.set_camera_index)
self.camera_btn.setAutoRaise(True)
#用来存放stacked界面
self.windowbox = QtWidgets.QGroupBox(Form)
self.windowbox.setGeometry(QtCore.QRect(0,100,1920,980))
self.windowbox.setObjectName("windowbox")
#创建一个stacked
self.stacked = QtWidgets.QStackedLayout(self.windowbox)
#main_frame界面
self.main_frame = QtWidgets.QMainWindow()
self.label1 = QtWidgets.QLabel(self.main_frame)
self.label1.setGeometry(QtCore.QRect(0,0,100,20))
self.label1.setText("第一个界面")
#label_frame 界面
self.label_frame = QtWidgets.QMainWindow()
self.label2 = QtWidgets.QLabel(self.label_frame)
self.label2.setGeometry(QtCore.QRect(0,0,100,20))
self.label2.setText("第二个界面")
#train_frame 界面
self.train_frame = QtWidgets.QMainWindow()
self.label3 = QtWidgets.QLabel(self.train_frame)
self.label3.setGeometry(QtCore.QRect(0,0,100,20))
self.label3.setText("第三个界面")
#dist_frame 界面
self.dist_frame = QtWidgets.QMainWindow()
self.label4 = QtWidgets.QLabel(self.dist_frame)
self.label4.setGeometry(QtCore.QRect(0,0,100,20))
self.label4.setText("第四个界面")
#camera_frame 界面
self.camera_frame = QtWidgets.QMainWindow()
self.label5 = QtWidgets.QLabel(self.camera_frame)
self.label5.setGeometry(QtCore.QRect(0,0,100,20))
self.label5.setText("第五个界面")
# 把切页的界面放到stacked中
self.stacked.addWidget(self.main_frame)
self.stacked.addWidget(self.label_frame)
self.stacked.addWidget(self.train_frame)
self.stacked.addWidget(self.dist_frame)
self.stacked.addWidget(self.camera_frame)
#功能
class MainWindow(QtWidgets.QMainWindow):
def __init__(self,parent=None):
super(MainWindow,self).__init__(parent)
self.ui=Ui()
self.ui.setupUi(self)
def set_main_index(self):
if self.ui.stacked.currentIndex() != 0:
self.ui.stacked.setCurrentIndex(0)
def set_label_index(self):
if self.ui.stacked.currentIndex() != 1:
self.ui.stacked.setCurrentIndex(1)
def set_train_index(self):
if self.ui.stacked.currentIndex() != 2:
self.ui.stacked.setCurrentIndex(2)
def set_dist_index(self):
if self.ui.stacked.currentIndex() != 3:
self.ui.stacked.setCurrentIndex(3)
def set_camera_index(self):
if self.ui.stacked.currentIndex() != 4:
self.ui.stacked.setCurrentIndex(4)
if __name__=="__main__":
app=QtWidgets.QApplication(sys.argv)
win=MainWindow()
win.showFullScreen()
sys.exit(app.exec_())
部分代码参考自:https://blog.csdn.net/s_daqing/article/details/104792859/
执行结果(就放了前两页):
选择文件/文件夹
选择单个文件:QFileDialog.getOpenFileName()
选择多个文件:QFileDialog.getOpenFileNames()
选择文件夹: QFileDialog.getExistingDirectory()
使用时可以使用path = QFileDialog.getOpenFileName()
来接收,如果要在其他函数中使用这个 path,可以先将path声明为全局变量,例如:
#按钮功能,选择文件夹
def select_dir(self):
global path
path=Qt.QFileDialog.getExistingDirectory()
文件保存:QFileDialog.getSaveFileName()
另存文件为 ,用法:https://blog.csdn.net/qq_44683653/article/details/106712862