pyqt5pyqt5入门


备注

本节概述了pyqt5是什么,以及开发人员为什么要使用它。

它还应该提到pyqt5中的任何大型主题,并链接到相关主题。由于pyqt5的文档是新的,您可能需要创建这些相关主题的初始版本。

添加应用程序图标

import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QIcon


class Example(QWidget):
    
    def __init__(self):
        super().__init__()
        
        self.initUI()
        
        
    def initUI(self):
        
        self.setGeometry(300, 300, 300, 220)
        self.setWindowTitle('Icon')
        self.setWindowIcon(QIcon('web.png'))        
    
        self.show()
        
        
if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_()) 
 

分析

Python中的函数参数

在Python中,用户定义的函数可以使用四种不同类型的参数。

  1. 默认参数:
  • 功能定义

    def defaultArg( name, msg = "Hello!"):

  • 函数调用

    defaultArg( name)

  1. 必需参数:
  • 功能定义

    def requiredArg (str,num):

  • 功能调用:

    requiredArg ("Hello",12)

  1. 关键字参数:
  • 功能定义

    def keywordArg( name, role ):

  • 函数调用

    keywordArg( name = "Tom", role = "Manager")

    要么

    keywordArg( role = "Manager", name = "Tom")

  1. 可变数量的参数:
  • 功能定义

    def varlengthArgs(*varargs):

  • 函数调用

    varlengthArgs(30,40,50,60)

class Example(QWidget):
    
    def __init__(self):
        super().__init__()
        ...
 

面向对象编程中的三个重要事项是类,数据和方法。在这里,我们创建一个名为Example 的新类。 Example 类继承自QWidget 类。这意味着我们调用两个构造函数:第一个用于Example 类,第二个用于继承的类。 super() 方法返回Example 类的父对象,我们调用它的构造函数。 self 变量指的是对象本身。

为什么我们使用__init__

看一下这个:

class A(object):
    def __init__(self):
        self.lst = []

class B(object):
    lst = []
 

现在尝试:

>>> x = B()
>>> y = B()
>>> x.lst.append(1)
>>> y.lst.append(2)
>>> x.lst
[1, 2]
>>> x.lst is y.lst
True
 

还有这个:

>>> x = A()
>>> y = A()
>>> x.lst.append(1)
>>> y.lst.append(2)
>>> x.lst
[1]
>>> x.lst is y.lst
False
 

这是否意味着在实例化之前建立了B类中的x?

是的,它是一个类属性(它在实例之间共享)。而在A类中,它是一个实例属性。

self.initUI() 
 

GUI的创建委托给initUI() 方法。

self.setGeometry(300, 300, 300, 220)
self.setWindowTitle('Icon')
self.setWindowIcon(QIcon('web.png'))  
 

这三个方法都是从QWidget 类继承而来的。 setGeometry() 做两件事:它在屏幕上定位窗口并设置它的大小。前两个参数是窗口的x和y位置。第三个是宽度,第四个是窗口的高度。实际上,它在一个方法中结合了resize()move() 方法。最后一个方法设置应用程序图标。为此,我们创建了一个QIcon 对象。 QIcon 接收要显示的图标的路径。

if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
 

创建应用程序和示例对象。主循环开始。

你好世界的例子

此示例创建一个带有按钮和布局中的行编辑的简单窗口。它还显示了如何将信号连接到插槽,以便单击该按钮可在行编辑中添加一些文本。

import sys
from PyQt5.QtWidgets import QApplication, QWidget


if __name__ == '__main__':
    
    app = QApplication(sys.argv)

    w = QWidget()
    w.resize(250, 150)
    w.move(300, 300)
    w.setWindowTitle('Hello World')
    w.show()
    
    sys.exit(app.exec_())
 

分析

app = QtWidgets.QApplication(sys.argv)

每个PyQt5应用程序都必须创建一个应用程序对象。 sys.argv参数是命令行中的参数列表。 Python脚本可以从shell运行。

w = QWidget()
 

QWidget 小部件是PyQt5中所有用户界面对象的基类。我们为QWidget 提供默认构造函数。默认构造函数没有父级。没有父项的窗口小部件称为窗口。

w.resize(250, 150)
 

resize() 方法调整窗口小部件的大小。它宽250px,高150px。

w.move(300, 300)
 

move() 方法将窗口小部件移动到屏幕上x = 300,y = 300坐标处的位置。

w.setWindowTitle('Hello World')
 

在这里,我们为窗口设置标题。标题显示在标题栏中。

w.show()
 

show() 方法在屏幕上显示小部件。窗口小部件首先在内存中创建,然后在屏幕上显示。

sys.exit(app.exec_())
 

最后,我们进入应用程序的主循环。事件处理从这一点开始。 mainloop从窗口系统接收事件并将它们分派给应用程序小部件。如果我们调用exit() 方法或主窗口小部件被销毁,则mainloop结束。 sys.exit() 方法确保干净的退出。将通知环境应用程序如何结束。

exec_() 方法有一个下划线。这是因为exec是一个Python关键字。因此,使用exec_() 代替。

安装或设置

  1. 安装Anaconda(PyQt5是内置版),尤其适用于Windows用户。
  2. 在PyCharm中集成QtDesigner和QtUIConvert(外部工具)
    • 打开PyCharm Settings > Tools > External Tools
    • 创建工具(QtDesigner) - 用于编辑* .ui文件
    • 创建工具(PyUIConv) - 用于将* .ui转换为* .py
  3. 写演示
    • 新的window.ui通过外部工具(QtDesigner)
    • 通过外部工具(PyUIConv)转换为window.py
    • 演示
      import sys
      from PyQt5.QtWidgets import QApplication,QMainWindow
      from window import Ui_MainWindow
      
      if __name__ == '__main__':
          app = QApplication(sys.argv)
          w = QMainWindow()
          ui = Ui_MainWindow()
          ui.setupUi(w)
          w.show()
          sys.exit(app.exec_())
       

将项目打包到excutable / installer中

cx_Freeze - 一个工具可以将项目打包到excutable / installer

  • 在通过pip安装之后,为了打包demo.py ,我们需要下面的setup.py
import sys
from cx_Freeze import setup, Executable

# Dependencies are automatically detected, but it might need fine tuning.
build_exe_options = {
    "excludes": ["tkinter"],
    "include_files":[('./platforms','./platforms')] # need qwindows.dll for qt5 application
}

# GUI applications require a different base on Windows (the default is for a
# console application).
base = None
if sys.platform == "win32":
    base = "Win32GUI"

setup(  name = "demo",
        version = "0.1",
        description = "demo",
        options = {"build_exe": build_exe_options},
        executables = [Executable("demo.py", base=base)])
 
  • 然后建立
python .\setup.py build
 
  • 分开
python .\setup.py bdist_msi
 

显示工具提示

import sys
from PyQt5.QtWidgets import (QWidget, QToolTip, 
    QPushButton, QApplication)
from PyQt5.QtGui import QFont    


class Example(QWidget):
    
    def __init__(self):
        super().__init__()
        
        self.initUI()
        
        
    def initUI(self):
        
        QToolTip.setFont(QFont('SansSerif', 10))
        
        self.setToolTip('This is a <b>QWidget</b> widget')
        
        btn = QPushButton('Button', self)
        btn.setToolTip('This is a <b>QPushButton</b> widget')
        btn.resize(btn.sizeHint())
        btn.move(50, 50)       
        
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Tooltips')    
        self.show()
        
        
if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
 

分析

QToolTip.setFont(QFont('SansSerif', 10))
 

此静态方法设置用于呈现工具提示的字体。我们使用10px SansSerif字体。

self.setToolTip('This is a <b>QWidget</b> widget')
 

要创建工具提示,我们调用setTooltip() 方法。我们可以使用富文本格式。

btn = QPushButton('Button', self)
btn.setToolTip('This is a <b>QPushButton</b> widget')
 

我们创建一个按钮小部件并为其设置工具提示。

btn.resize(btn.sizeHint())
btn.move(50, 50) 
 

正在调整按钮的大小并在窗口上移动。 sizeHint() 方法为按钮提供了建议的大小。