很多教程在写窗体程序都是先简单教你设计器,然后说设计器不能帮助你掌握,于是开始直接敲代码。
我个人不是很赞成这种做法。使用设计器的好处是直观、维护方便,尤其开发复杂窗体的效率高。
但是设计器每次修改ui文件后,需要重新生成py文件,会将原来的内容覆盖掉,为了避免这种情况,引入了一个中间类Window。
开始之前,我默认您已经完成了external tools的配置。下面,主要步骤如下:
点击external tools , 使用QtDesigner创建一个Main Window,保存成GUI.ui。
点击external tools,pyuic5转化成.py文件。结构如下:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'GUI.ui'
#
# Created by: PyQt5 UI code generator 5.15.2
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(270, 170, 150, 46))
self.pushButton.setObjectName("pushButton")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 37))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "PushButton"))
from PyQt5 import QtWidgets
import GUI
import sys
# 中间类Window的写法
class Window(GUI.Ui_MainWindow, QtWidgets.QMainWindow):
def __init__(self):
super(Window, self).__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.msg)#一个按钮的点击事件,响应函数为 def msg(self):
def msg(self):
# directory1 = QFileDialog.getExistingDirectory(self,"选取文件夹","./") #起始路径
# print(directory1)
filePath, filetype = QtWidgets.QFileDialog.getOpenFileName(self, "选取文件", "./",
"*.*")
# print(filetype)
print(filePath)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
mywindow = Window()
mywindow.show()
sys.exit(app.exec_())