前期准备
安装pyqt5和tools库
pip install PyQt5
pip install PyQt5-tools
用国内镜像源安装也可以
pip install PyQt5 -i https://pypi.douban.com/simple
pip install PyQt5-tools -i https://pypi.douban.com/simple
在pycharm里插入qtdesigner和uic插件
qtdesigner的三个配置如下
程序: F:\anaconda\envs\wyd_yolov5\Lib\site-packages\qt5_applications\Qt\bin\designer.exe
注意根据自己环境位置确定,在自己文件夹下的site-packages\qt5_applications\Qt\bin\designer.exe目录下。
实参:此处空着
工作目录:$FileDir$
$FileDir$
pyuic的三个配置如下
程序: F:\anaconda\envs\wyd_yolov5\Scripts\pyuic5.exe
注意在自己环境目录下的Scripts\pyuic5.exe位置
实参:$FileName$ -o $FileNameWithoutExtension$.py
工作目录:$FileDir$
$FileName$ -o $FileNameWithoutExtension$.py
界面绘制
自行使用qt dexigner绘制,不作赘述
界面显示
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from zhuzijiemian import Ui_QT5
class MyWindow(QWidget, Ui_QT5):
def __init__(self):
super().__init__()
self.setupUi(self)
if __name__ == "__main__":
app = QApplication(sys.argv)
w = MyWindow()
w.show()
sys.exit(app.exec_())
QWidget是窗口类型,Ui_QT5是窗口名称,即在转化后的界面文件中定义class Ui_QT5。
app = QApplication(sys.argv)
- 这行代码创建了一个
QApplication
对象。在 PyQt 中,每个 GUI 应用程序都必须有一个QApplication
实例。这个实例负责管理应用程序的控制流和主要设置。 sys.argv
是一个从 Python 标准库sys
模块传入的参数列表。它使得您的 PyQt 应用程序可以接收命令行参数。这对于某些类型的应用程序(例如,那些需要文件路径作为输入的应用程序)是很有用的。sys.exit(app.exec_())
app.exec_()
这个方法启动了应用程序的事件循环。简而言之,事件循环是一个无限循环,它等待并处理事件,例如鼠标点击或按键,并将它们发送到适当的控件。在 PyQt 中,没有启动事件循环的话,窗口可能会瞬间出现后消失,因为程序会立即结束。sys.exit()
函数确保主程序能够干净地退出。当app.exec_()
事件循环结束时(例如,当您关闭了主窗口),app.exec_()
会返回一个整数值,表示应用程序是如何结束的。sys.exit()
使用这个值来通知系统应用程序是如何结束的。
在QT中使用Qthread和thread区别
在 PyQt 中,信号和槽是一种特殊的机制,用于在对象之间安全地传递信息。这在多线程应用程序中尤其重要,因为直接从一个线程更新另一个线程(特别是UI线程)的状态可能会导致数据不一致或程序崩溃。
- 信号(Signal):是由对象发出的消息,表明已经发生了某种动作或事件。例如,一个按钮可能会在被点击时发出一个信号。
- 槽(Slot):是一个函数或方法,它在接收到特定信号时被调用。您可以将多个槽连接到同一个信号上,这样当信号发出时,所有连接的槽都会被调用。
如果您的程序中的线程仅执行一些后台任务,比如执行计算或处理数据,而不需要与主UI线程交互(例如,更新UI元素或响应用户操作),那么您可能不需要使用信号和槽机制。在这种情况下,使用 Python 标准库中的 threading
模块可能更简单。
然而,如果您的后台线程需要在其执行过程中更新UI,或者需要在任务完成后通知UI线程(例如,启用或禁用按钮,更新进度条,显示消息等),那么使用 PyQt 的信号和槽机制会更安全,因为它们是为了跨线程通信而设计的,可以确保这些更新和通信在UI线程中安全地进行。在这种情况下,您应该使用 QThread
和相关的信号和槽机制。