PyQt Designer安装与使用

了解PyQt的历史以及协议,Qt实际是C++的一套GUI编程的套件,底层就是C++ Qt,Python将其做了封装之后才有了PyQt的UI库。

  • Qt4->PyQt4->PySide
  • Qt5->PyQt5->PySide2

PySide和PyQt实际是一回事,只是开源协议有所不同,从我使用的角度来说有些高级功能可能不太一样,比如数据库的支持,比如uic的支持,最新版本的Houdini、Maya与Nuke中内置PySide2,以前老版本是内置PySide,内置使用起来就比较方便,当然你非得使用PyQt5,就得基于具体的软件的Python环境去编译一套PyQt库来使用。

PyQt5和PySide2可以直接通过pip安装即可,如果有特殊版本得费点心思,一般安装好PySide2,你就可以找到这个C:Python37Libsite-packagesPySide2designer.exe

PySide2库的层级结构

  • QtCore 核心算法库
  • QtGui 界面图形算法库
  • QtWidgets 界面控件库
  • uic ui文件到py文件的桥梁
  • sip C++对象到Python转换库

QtCore 包含了核心的非GUI的功能。主要和时间、文件与文件夹、各种数据、流、URLs、mime类文件、进程与线程一起使用。

QtGui 包含了窗口系统、事件处理、2D图像、基本绘画、字体和文字类。

QtWidgets类包含了一系列创建桌面应用的UI元素。 QtMultimedia包含了处理多媒体的内容和调用摄像头API的类。 QtBluetooth模块包含了查找和连接蓝牙的类。 QtNetwork包含了网络编程的类,这些工具能让TCP/IP和UDP开发变得更加方便和可靠。 QtPositioning包含了定位的类,可以使用卫星、WiFi甚至文本。 Engine包含了通过客户端进入和管理Qt Cloud的类。 QtWebSockets包含了WebSocket协议的类。 QtWebKit包含了一个基WebKit2的web浏览器。 QtWebKitWidgets包含了基于QtWidgets的WebKit1的类。 QtXml包含了处理xml的类,提供了SAX和DOM API的工具。 QtSvg提供了显示SVG内容的类,Scalable Vector Graphics (SVG)是一种是一种基于可扩展标记语言(XML),用于描述二维矢量图形的图形格式(这句话来自于维基百科)。 QtSql提供了处理数据库的工具。 QtTest提供了测试PyQt5应用的工具。

一般PyQt的代码分手写与Designer设计,Designer设计出来的.ui文件又分两种使用方法,要么编译成.py文件去使用,要么直接通过方法load这个.ui文件来使用。按Python环境来验证哪种更方便。

from PySide2 import QtGui
from PySide2 import QtCore
from PySide2 import QtWidgets

class CustomDialog(QtWidgets.QDialog):
    pass

if __name__ == "__main__":
    dialog = CustomDialog()
    dialog.show()
import sys

from PySide2 import QtGui
from PySide2 import QtCore
from PySide2 import QtWidgets

class CustomDialog(QtWidgets.QDialog):
    pass

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    dialog = CustomDialog()
    dialog.show()
    print(dir(app))
    app.exec_()
import sys

from PySide2 import QtGui
from PySide2 import QtCore
from PySide2 import QtWidgets

class CustomDialog(QtWidgets.QDialog):
    def __init__(self):
        super().__init__()

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    dialog = CustomDialog()
    dialog.show()
    print(dir(app))
    app.exec_()

手写代码

from PySide2 import QtGui
from PySide2 import QtCore
from PySide2 import QtWidgets

class CustomDialog(QtWidgets.QDialog):
    def __init__(self, parent=None):
        # super().__init__(parent)
        super(CustomDialog, self).__init__(parent)

        # mainLayout = QtWidgets.QVBoxLayout()
        # self.setLayout(mainLayout)
        vblLayout = QtWidgets.QVBoxLayout(self)

        gbSim = QtWidgets.QGroupBox()
        gbSim.setTitle("Sim or Seq:")
        hblLayout = QtWidgets.QHBoxLayout(gbSim)
        rbSim = QtWidgets.QRadioButton("Simulation")
        rbSeq = QtWidgets.QRadioButton("Sequence")

        hblLayout.addWidget(rbSim)
        hblLayout.addWidget(rbSeq)

        pbSubmit = QtWidgets.QPushButton("Submit")
        vblLayout.addWidget(gbSim)
        vblLayout.addWidget(pbSubmit)

if __name__ == "__main__":
    dialog = CustomDialog()
    dialog.show()

PySide2加载.ui文件模式

from PySide2 import QtUiTools
from PySide2 import QtWidgets
from PySide2 import QtGui
from PySide2 import QtCore

class CustomDialog(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(CustomDialog, self).__init__(parent)

        loader = QtUiTools.QUiLoader()

        self.ui = loader.load(r"D:\2020\test.ui")

        mainLayout = QtWidgets.QVBoxLayout()
        mainLayout.setContentsMargins(0, 0, 0, 0)
        mainLayout.addWidget(self.ui)
        self.setLayout(mainLayout)

dialog = CustomDialog()
dialog.show()

转py文件

# C:\Python37\Scripts\pyside2-uic.exe -o D:\2020\mainWin.py D:\2020\test.ui

import sys

path = "D:/2020"

path in sys.path or sys.path.insert(0, path)

from PySide2 import QtWidgets
from PySide2 import QtGui
from PySide2 import QtCore
import mainWin
reload(mainWin)

class CustomDialog(QtWidgets.QDialog, mainWin.Ui_Dialog):
    def __init__(self, parent=None):
        super(CustomDialog, self).__init__(parent)

        self.setupUi(self)

dialog = CustomDialog()
dialog.show()

信号与槽(事件)

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QWidget, QLCDNumber, QSlider,
    QVBoxLayout, QApplication)


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        lcd = QLCDNumber(self)
        sld = QSlider(Qt.Horizontal, self)

        vbox = QVBoxLayout()
        vbox.addWidget(lcd)
        vbox.addWidget(sld)

        self.setLayout(vbox)
        sld.valueChanged.connect(lcd.display)

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Signal and slot')
        self.show()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

参考文档: