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 二进制安装

  1. python3-devel 和 qt5-devel
    sudo dnf install python3-devel
    sudo dnf install qt5-devel
  2. 把压缩包放到 Downloads 文件夹下面,然后解压
    tar xvf pyqt5_install.tar
  3. 安装 sip 和 pyqt5
    cd pyqt5_install
    ./install.sh

310 源码安装: pyqt编译时间较长,大约4个小时

  1. 安装 python3-devel 和 qt5-devel
    sudo dnf install python3-devel
    sudo dnf install qt5-devel
  2. 编译并安装 sip
    tar zxvf sip-4.19.8.tar.gz
    cd sip-4.19.8
    python3 configure.py
    make
    sudo make install
  3. 编译并安装 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

  1. pyqt 优点在于可以直接使用 qt designer 的 ui 文件,先使用 qt designer 摆放好布局,设置好属性,然后导入这个 ui,就可以直接使用 ui 中的控件了。 qt designer 在 /usr/lib64/qt5/bin/designer

  1. 在界面上摆放好需要的控件,然后调整合适的大小。在右侧的对象查看器里面选择相应的对象,

  1. 在信号与槽编辑器中可以选择发送信号的控件,以及发送的是哪种信号。当然也可以在代码中对信号和槽进行绑定。
  • 信号(Signal)就是在特定情况下被发射的事件,例如PushButton 最常见的信号就是鼠标单击时发射的 clicked() 信号,一个 ComboBox 最常见的信号是选择的列表项变化时发射的 CurrentIndexChanged() 信号。
  • 槽(Slot)就是对信号响应的函数。槽就是一个函数,与一般的C++函数是一样的,可以定义在类的任何部分(public、private 或 protected),可以具有任何参数,也可以被直接调用。槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。

参考: https://www.cnblogs.com/linyfeng/p/11273062.html

  1. 在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

  1. 所有的应用都是事件驱动的。事件大部分都是由用户的行为产生的,当然也有其他的事件产生方式,比如网络的连接,窗口管理器或者定时器等。调用应用的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)
  2. 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

  1. 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

  1. 字符串输入框 :
    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

  1. 获取文件夹路径提示框 :

    path = QFileDialog.getExistingDirectory(self, "directory", "/home/openailab/")
    • 第一个参数是父窗口
    • 第二个参数是标题
    • 第三个参数是默认路径
    • 返回值是返回的文件夹路径
  2. 定时器:

    • 生成定时器对象 holdTime = QTimer()
    • 连接定时器超时溢出和相应的槽函数 holdTime.timeout.connect(HoldTimeOut)
    • 开始定时器 holdTime.start(2000)
    • 停止定时器 holdTime.stop()
  3. 想要在点击关闭按钮之后,程序退出之前处理一些功能,可以如下面这样去做。
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

标签: Qt, python

添加新评论