目录
在PyCharm中配置转换插件(我假设你已经知道PyQt5是干嘛用的,并且你知道PyQt5生成的是.ui的文件)
大纲
概述
PyQt5是对Qt所有类的Python封装,即可以利用Qt的强大功能,也可以利用Python丰富的生态,同时能够结合Python简洁的语法进行操作,其结果就是使用PyQt5可以高效简单地开发出自己想要的程序。
在PyCharm中配置转换插件(我假设你已经知道PyQt5是干嘛用的,并且你知道PyQt5生成的是.ui的文件)
首先不管三七二十一,先在PyCharm中配置转换插件,可以使得PyQt5中创建的.ui文件能够转换成.py文件供我们后续使用,至于具体的使用场景,下面的栗子会具体说到。
当然,ui.转.py是可以通过命令窗口通过命令去转换的,我这里介绍的是一个比较方便的操作,配置好之后,可以直接右键点击,即可完成转换。
打开PyCharm,点击Settings ——>Tools ——>External Tools而后选择右侧的“+”号,可以看到有如下弹窗:
弹窗内部,填写如下信息,开始配置pyuic:
Name:pyuic
Program:C:\Users\honey\AppData\Local\Programs\Python\Python37\python.exe(这里填入的是你安装的python.exe的绝对路径,这个就不要复制我的啦 .. )
Arguments:-m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py
Working directory:$FileDir$
为了使用方便,我这里也把QT Designer的快捷启动方式,也一并配置了进来,你们可配置可不配,看个人,我顺便一起贴出来:
Name:QtDesigner
Program:D:\Python27\Lib\site-packages\PyQt4\designer.exe(这里填入的是你的designer.exe的绝对路径,这个就不要复制我的啦 .. )
Working directory:$FileDir$
顺便说一句,不要纠结我路径里面的Python27,也不要纠结PyQt4,我原来用的是Python27现在用Python30+,原来用的是PyQt4,而现在用的是PyQt5,用的是哪个版本的designer.exe,没有太大关系,最终关注的是,它本质的转换是转换成PyQt5,写代码的时候import的是PyQt5的包就可以了。
配好之后,是这样的,具体的使用可以看下面的栗子:
举个栗子
PyCharm中,我们新建一个项目。
打开QT Designer,我们创建一个新的ui,这里我选择的是Main Window,并将该ui,保存到PyCharm新建的项目的路径下,取名为test.ui:
也不需要做太复杂的UI,我这里只用了一个label,做做测试而已,Ctrl+R可以预览效果:
再到PyCharm看我们的项目,右键点击test.ui,选择External Tools,可以看到,我们之前配置好的pyuic与QtDesigner:
而后,直接选择pyuic,等待0.x秒,可以看到它执行了-m PyQt5.uic.pyuic test.ui -o test.py而这个命令,就是我们之前在配置pyuic的时候,配置的命令。并且,在项目目录下,生成了一个test.py文件:
那么打开test.py,可以看到:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'test.ui'
#
# Created by: PyQt5 UI code generator 5.12.1
#
# WARNING! All changes made in this file will be lost!
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.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.label = QtWidgets.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setFamily("等线 Light")
font.setPointSize(11)
self.label.setFont(font)
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "这仅仅只是一个测试"))
然后接下来的所有对ui的操作,都将无比的方便!
但是注意!注意!!请注意!!!—— 所有的UI操作、对UI的事件处理,都不能直接写到这个test.py文件下,不能直接写!!!因为一旦你在designer.exe中对test.ui有任何的改变,都是需要重新使用pyuic才能将test.ui文件中的更改更新到test.py文件中的,而更新后的test.py会是一个新的.py文件,会将之前所有的,全部覆盖。如果一旦你在这里写了一些方法,或者是一些UI操作,全部都会被覆盖,消失不见。
那么这个时候,如果想对UI有一些操作,但是又不能写到test.py中,该怎么办 —— 那就另外新建一个.py,对test.py进行引用,然后,操作新建的.py就可以啦:
新建一个.py,命名为UsingTest.py:
import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QMainWindow
from test import Ui_MainWindow # 加载我们的布局
class UsingTest(QMainWindow, Ui_MainWindow):
def __init__(self, *args, **kwargs):
super(UsingTest, self).__init__(*args, **kwargs)
self.setupUi(self) # 初始化ui
# 在这里,可以做一些UI的操作了,或者是点击事件或者是别的
# 也可以另外写方法,可以改变lable的内容
self.change()
def change(self):
self.label.setText("试试,改变内容")
if __name__ == '__main__': # 程序的入口
app = QApplication(sys.argv)
win = UsingTest()
win.show()
sys.exit(app.exec_())
运行一下代码,可以看到,label由原来的“这仅仅只是一个测试”变成了“试试,改变内容”:
Over.