最近用pyqt5开发了一个GUI小程序,在此做下总结~
安装
安装pyqt5和pyqt5-tools
pip install pyqt5
pip install pyqt5-tools
在PyCharm中集成PyQt
因为我使用PyCharm开发,所以将PyQt集成进去来提高效率, 操作步骤如下
1.打开【File->Settings->Tools->External Tools】
2.点击“+”号按钮,添加“designer”
说明:Program的内容是:
D:\PythonProjects\TDTool\venv\Lib\site-packages\qt5_applications\Qt\bin\designer.exe
3.再次点击“+”号按钮,添加“pyUIC”
说明:Program的内容是:
D:\PythonProjects\TDTool\venv\Scripts\pyuic5.exe
Arguments的内容是:
$FileName$ -o $FileNameWithoutExtension$.py
4.完成以上步骤后,我们在项目上"鼠标右键->External Tools",就可以看到designer和pyUIC
5.选择designer可以打开UI的设计界面,通过控件的拖拽完成界面设计,保存为*.ui文件
6.在*.ui文件上"右键->External Tools->pyUIC",将ui文件转化为python代码
编写界面控件的逻辑代码
1.启动界面
在完成ui文件到py文件的转换后,我们需要定义一个新的类来实现界面的功能,该类要继承界面类和界面类型类
from about import Ui_About
from PyQt5.QtWidgets import QDialog
class AboutDialog(QDialog, Ui_About):
def __init__(self):
super().__init__()
self.setupUi(self)
说明:“Ui_About”类是ui文件转py生成的,而我在用designer设计这个界面时,使用的是“QDialog”类型,调用"setupUi"方法初始化界面。
再运行以下代码,即可打开界面了
import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import Qt, QCoreApplication
QCoreApplication.setAttribute(Qt.AA_EnableHighDpiScaling) # 分辨率自适应
app = QApplication(sys.argv)
about = AboutDialog()
about.show()
sys.exit(app.exec_())
2.修改控件的属性
- 只保留最小化和关闭(不支持界面最大化)
self.setWindowFlags(Qt.WindowMinimizeButtonHint | Qt.WindowCloseButtonHint)
- 修改界面标题
self.setWindowTitle("TDTool")
- 修改界面图标
self.setWindowIcon(QIcon(icon_path))
- 表单控件-禁用自动行号
self.tableWidget.verticalHeader().setVisible(False)
- 表单控件-设置某列宽度自适应
self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
self.tableWidget.horizontalHeader().setSectionResizeMode(0, QHeaderView.ResizeToContents)
- 提示框
msg_box = QMessageBox(QMessageBox.Warning, "警告", str(e))
msg_box.exec_()
3.实现控件的动作
- 按钮
self.start_button.clicked.connect(self.start) # 在start中写要干的事
- 下拉框
self.comboBox_func.currentIndexChanged.connect(self.show) # 在show中写当下拉框序号改变时要干的事
- 菜单中的action
self.action1.triggered.connect(self.show1) # show1中写点击菜单中的action1要干的事
4.如果要干的事比较耗时,需要放到线程中去做,避免界面长时间无响应
实现qt线程只需要继承QThread并重写run方法
from PyQt5.QtCore import QThread, pyqtSignal
class DoSomethingThread(QThread):
info_signal = pyqtSignal(str) # 定义信号用于与主界面通信
def __init__(self, *args):
super().__init__()
def run(self) -> None:
"""这里写线程要干的事"""
self.info_signal.emit("hello world!") # 发信号
mythread = DoSomethingThread()
mythread.info_signal.connect(doinfo) # doinfo是处理信号的函数
mythread.start()