pyqt 简介
pyqt 介绍
qt 介绍
Qt 是一个著名的 C++ 库——并不只是一个 GUI 库。使用 Qt,在一定程序上你获得的是一个“一站式”的服务:不再需要研究 STL,不再需要 C++ 的string,因为Qt有它自己的 QString 等等。Qt 本身包含的模块也日益丰富, 一直有新模块和第三方模块加入进来。
QT中的信号与槽(Signal & Slot)机制是 Qt 编程的基础,也是 Qt 的一大创新,使得在 Qt 中处理界面各个组件的交互操作时变得更加直观和简单。
Qt的优点在于:
- 跨平台实现
- 广泛的库
- 友好的API,友好的库实现代码
- 提供偏向生产力的 Qt widgets 和 偏向交互的 Qt Quick,以及使用 html 的 Qt webengine
基于 Qt 开发的软件: KDE, WPS、YY语音、Skype、豆瓣电台、虾米音乐、淘宝助理、千牛、暴雪的战网客户端、VirtualBox、Opera、咪咕音乐、Google地图、Adobe Photoshop Album 等
嵌入式 Linux 上很多带界面软件也是基于 Qt 来编写的。
pyqt 介绍
PyQt实现了一个Python模块集。它有超过300类,将近6000个函数和方法。它是一个多平台的工具包,可以运行在所有主要操作系统上,包括UNIX,Windows和Mac。
为可用的类有很多,他们被分成几个模块。
- QtCore模块包含核心的非GUI功能。该模块用于时间、文件和目录、各种数据类型、流、网址、MIME类型、线程或进程。
- QtGui模块包含图形组件和相关的类,例如按钮、窗体、状态栏、工具栏、滚动条、位图、颜色、字体等。
- QtNetwork模块包含了网络编程的类,这些类允许编写TCP/IP和UDP的客户端和服务器,他们使网络编程更简单,更轻便。
- QtXml包含使用XML文件的类,这个模块提供了SAX和DOM API的实现。
- QtSvg模块提供显示的SVG文件的类。可缩放矢量图形(SVG)是一种用于描述二维图形和图形应用程序的XML语言。
- QtOpenGL模块使用OpenGL库渲染3D和2D图形,该模块能够无缝集成Qt的GUI库和OpenGL库。
- QtSql模块提供用于数据库的类。
基于 qt 的 python 界面: pyqt, pyside 基于 qt 的界面:Tkinter, WxPython
pyqt 安装
310 二进制安装
- python3-devel 和 qt5-devel
sudo dnf install python3-devel sudo dnf install qt5-devel
- 把压缩包放到 Downloads 文件夹下面,然后解压
tar xvf pyqt5_install.tar
- 安装 sip 和 pyqt5
cd pyqt5_install ./install.sh
310 源码安装: pyqt编译时间较长,大约4个小时
- 安装 python3-devel 和 qt5-devel
sudo dnf install python3-devel sudo dnf install qt5-devel
- 编译并安装 sip
tar zxvf sip-4.19.8.tar.gz cd sip-4.19.8 python3 configure.py make sudo make install
- 编译并安装 pyqt5
tar zxvf PyQt5_gpl-5.10.1.tar.gz cd PyQt5_gpl-5.10.1 python3 configure.py --qmake /usr/bin/qmake-qt5 make sudo make install
测试是否正确安装:
python3 import PyQt5 exit()
Qt designer:
/usr/lib64/qt5/bin/designer
pyqt GUI
- pyqt 优点在于可以直接使用 qt designer 的 ui 文件,先使用 qt designer 摆放好布局,设置好属性,然后导入这个 ui,就可以直接使用 ui 中的控件了。 qt designer 在
/usr/lib64/qt5/bin/designer
。
- 在界面上摆放好需要的控件,然后调整合适的大小。在右侧的对象查看器里面选择相应的对象,
- 修改对象的名称方便 python 文件中调用,objectnames 条目
- 修改控件上的初始文字,text 条目
- 如果有 layout,修改里面包含的控件的比例大小, layoutstretch 条目
参考: https://blog.csdn.net/QQ2558030393/article/details/90745141
https://blog.csdn.net/pziq88/article/details/104107034
- 在信号与槽编辑器中可以选择发送信号的控件,以及发送的是哪种信号。当然也可以在代码中对信号和槽进行绑定。
- 信号(Signal)就是在特定情况下被发射的事件,例如PushButton 最常见的信号就是鼠标单击时发射的 clicked() 信号,一个 ComboBox 最常见的信号是选择的列表项变化时发射的 CurrentIndexChanged() 信号。
- 槽(Slot)就是对信号响应的函数。槽就是一个函数,与一般的C++函数是一样的,可以定义在类的任何部分(public、private 或 protected),可以具有任何参数,也可以被直接调用。槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。
参考: https://www.cnblogs.com/linyfeng/p/11273062.html
- 在ui 文件的同级目录建立 python 文件。参考下面的代码按照 ui 文件进行修改,观察是否点击按钮后,输出相应的文字。
import sys
from PyQt5.uic import loadUi
from PyQt5.QtWidgets import QMainWindow, QApplication
def ShowString():
print("Hello EveryOne")
class MainWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
loadUi("test.ui", self)
self.pushButton.clicked.connect(ShowString)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
参考: https://blog.csdn.net/josephzhang1012/article/details/86696107
-
所有的应用都是事件驱动的。事件大部分都是由用户的行为产生的,当然也有其他的事件产生方式,比如网络的连接,窗口管理器或者定时器等。调用应用的exec_()方法时,应用会进入主循环,主循环会监听和分发事件。 PyQt5处理事件方面有个signal and slot机制。Signals and slots用于对象间的通讯。事件触发的时候,发生一个signal,slot是用来被Python调用的,slot只有在事件触发的时候才能调用。
- 信号与槽关联是用 QObject::connect() 函数实现的,其基本格式是:
QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
- 可以省略 Qobject,直接写为
connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
- 在 pyqt 中 connect 函数变得很简单, 例如:
button.clicked.connect(click_func)
- 信号与槽关联是用 QObject::connect() 函数实现的,其基本格式是:
- Pushbutton 相关方法:
- 设定按键能否处于自锁的按下状态,默认非自锁:
setCheckable(bool)
- 设定按键当前是否处于按下状态,一般是配合自锁使用:
setChecked(bool)
- 设定按键是否使能,某些情况下,按键必须不可用,用户才不会误操作:
setEnabled(bool)
- 常用于发射信号的动作:
clicked
- 设定按键能否处于自锁的按下状态,默认非自锁:
参考: https://blog.csdn.net/CV_Jason/article/details/89577322
https://www.zhihu.com/question/417148423
https://blog.csdn.net/sugarfreewang/article/details/89890865
- label 相关方法:
- 内容清除:
clear()
- 显示 mat 类型的图片
- 内容清除:
img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
qimg = QImage(img.data, img.shape[1], img.shape[0], QImage.Format_RGB888)
self.label_video.setPixmap(QPixmap.fromImage(qimg))
参考: https://blog.csdn.net/xqhrs232/article/details/78200779
https://blog.csdn.net/why19940926/article/details/77604338
https://blog.csdn.net/sunatmine/article/details/109224468
https://blog.csdn.net/weixin_38383877/article/details/104723297
https://blog.csdn.net/jia666666/article/details/81504595
https://www.cnblogs.com/wxt51/p/10100725.html
https://blog.csdn.net/Littlehero_121/article/details/106586545
- 字符串输入框 :
text, ret = QInputDialog.getText(self, "title", "label", QLineEdit.Normal, "default")
- 第一个参数是父窗口
- 第二个参数是标题
- 第三个参数是提示文字
- 第一个返回值是输入的文字内容
- 第二个返回值表明是按了 ok 还是 cancel 按键。
参考: http://c.biancheng.net/view/1870.html
https://blog.csdn.net/weixin_39770778/article/details/79611558
https://blog.csdn.net/Aliven888/article/details/113767549
https://www.cnblogs.com/linyfeng/p/11294173.html
https://www.cnblogs.com/linyfeng/p/11223711.html
https://www.cnblogs.com/grandyang/p/4672902.html
-
获取文件夹路径提示框 :
path = QFileDialog.getExistingDirectory(self, "directory", "/home/openailab/")
- 第一个参数是父窗口
- 第二个参数是标题
- 第三个参数是默认路径
- 返回值是返回的文件夹路径
-
定时器:
- 生成定时器对象
holdTime = QTimer()
- 连接定时器超时溢出和相应的槽函数
holdTime.timeout.connect(HoldTimeOut)
- 开始定时器
holdTime.start(2000)
- 停止定时器
holdTime.stop()
- 生成定时器对象
- 想要在点击关闭按钮之后,程序退出之前处理一些功能,可以如下面这样去做。
void closeEvent(QCloseEvent *ev)
{
xxx.func()
ev->accept();
}
参考: https://blog.csdn.net/liang_clg/article/details/76211690
pyqt 教程
中文
https://maicss.gitbooks.io/pyqt5/content/
https://github.com/maicss/PyQt5-Chinese-tutorial
英文
https://zetcode.com/gui/pyqt5/
参考: https://www.cnblogs.com/linyfeng/category/1546338.html
https://www.cnblogs.com/lovesoo/p/12491361.html
http://c.biancheng.net/view/1792.html
http://c.biancheng.net/view/1823.html