pyqt5入门

发布时间 2023-06-03 21:14:25作者: 淦丘比

基础流程

如下,就可以实现一个最基础的窗口,但也只有一个窗口:

import sys
from PyQt5.QtWidgets import QApplication, QWidget


if __name__ == '__main__':

    app = QApplication(sys.argv)

    w = QWidget()
    w.show()

    sys.exit(app.exec_())

讲解一下:

  1. 引入PyQt5.QtWidgets模块,这个模块包含了基本的组件:
import sys
from PyQt5.QtWidgets import QApplication, QWidget
  1. 创建一个应用对象:
    app = QApplication(sys.argv)

  2. 创建一个基础控件(窗口):
    w = QWidget()
    QWidge控件是一个用户界面的基本控件,它提供了基本的应用构造器。

  3. 显示窗口:
    w.show()
    show()能让控件在桌面上显示出来。控件在内存里创建,之后才能在显示器上显示出来。

  4. 安全退出:
    sys.exit(app.exec_())

基础操作

  • 窗口大小:
    w.resize(250, 150)
    resize()方法能改变控件的大小,这里的意思是窗口宽250px,高150px。

  • 窗口位置:
    w.move(300, 300)
    move()是修改控件位置的方法。它把控件放置到屏幕坐标的(300, 300)的位置。注:屏幕坐标系的原点是屏幕的左上角。

  • 窗口大小和位置:
    w.setGeometry(300, 300, 300, 220)
    setGeometry()有两个作用:把窗口放到屏幕上并且设置窗口大小。参数分别代表屏幕坐标的x、y和窗口大小的宽、高。也就是说这个方法是resize()和move()的合体。

  • 窗口标题:
    w.setWindowTitle('标题的名字')
    这样就能给窗口添加一个标题。

  • 显示窗口图标:
    需要先导入库:
    from PyQt5.QtGui import QIcon
    然后就可以给窗口添加标题了:
    w.setWindowIcon(QIcon('web.png'))

  • 创建按钮:
    btn = QPushButton('Button', w)
    第一个参数是显示在按钮上的内容,第二个参数是按钮在哪个对象组件)上。

  • 按钮的相关操作:
    按钮的操作跟窗口一致。
    改变位置:btn.move(100,150)
    其他的也一样。

  • 创建提示框:
    提示框就是在鼠标放在特定地点时,会出现的信息。
    btn.setToolTip('This is a <b>QPushButton</b> widget')
    含义:当鼠标放在组件 btn 上时,会显示参数('This is a <b>QPushButton</b> widget')的消息。

  • 修改提示框字体:
    这个操作需要两步。

    1. 导入库:
      from PyQt5.QtGui import QFont
    2. 修改成特定字体:
      QToolTip.setFont(QFont('SansSerif', 10))
      setFont()这个静态方法设置了提示框的字体,我们使用了10px的SansSerif字体。
  • 关闭窗口:
    需要三步,

    1. 需要用到QtCore对象:
      from PyQt5.QtCore import QCoreApplication
    2. 创建一个按钮:
      qbtn = QPushButton('Quit', w)
    3. 把按钮的点击事件和能终止进程并退出应用的quit函数绑定在一起:
      qbtn.clicked.connect(QCoreApplication.instance().quit)
    • 解释一下具体逻辑:
      1. 创建一个按钮的点击事件:
        qbtn.clicked.connect()
      2. QCoreApplication实例的quit()函数能用于终止进程。
      3. 通过instance()创建一个QCoreApplication实例,并将其quit()跟按钮的点击事件绑定在一起。
        qbtn.clicked.connect(QCoreApplication.instance().quit)
  • 按钮的点击事件:
    以关闭窗口的代码为例,
    qbtn.clicked.connect(QCoreApplication.instance().quit)

    1. qbtn.clicked.connect()这个函数可以用于给按钮的点击事件绑定一个函数。
    2. qbtn.clicked.connect()这个函数只会接受一个参数,也就是绑定的那个函数。
    3. 但是绑定函数时,是会跟常规调用函数有一定区别的,也就是会把调用函数时结尾的()去掉。因此就变成了这个结果。
      qbtn.clicked.connect(QCoreApplication.instance().quit)
      给按钮创建一个点击事件的同时,绑定了一个函数。
  • 消息盒子:

QMessageBox.question(w, 'Message',
    "Are you sure to quit?", QMessageBox.Yes | 
    QMessageBox.No, QMessageBox.No)

好了,讲解时刻,分别讲一下每个参数的作用:

  1. w:就是指这个消息的父组件是什么,也就是消息会显示在哪里的意思。
  2. 'Message':就是消息盒子的标题。
  3. "Are you sure to quit?":就是消息盒子里的内容
  4. QMessageBox.Yes | QMessageBox.No:就是消息框的俩按钮,这个不会太多,不知道能不能有三个甚至更多个按钮。
  5. QMessageBox.No:这最后一个参数是默认按钮,也就是默认(如果直接叉了消息盒子)选“QMessageBox.No”。

至于这个消息盒子要怎么用,那就是类似按钮事件一样,通过绑定函数的方式来进行使用了。

  • 窗口居中:
    要分四步来进行

    1. 获得主窗口所在的框架:
      qr = w.frameGeometry()
    2. 获取显示器的分辨率,然后得到屏幕中间点的位置:
      不过先导入from PyQt5.QtWidgets import QDesktopWidget
      然后才能用下面的方式来获取到屏幕中间点的位置:
      cp = QDesktopWidget().availableGeometry().center()
    3. 把主窗口框架的中心点放置到屏幕的中心位置:
      qr.moveCenter(cp)
    4. 最后通过move函数把主窗口的左上角移动到其框架的左上角,这样就把窗口居中了:
      w.move(qr.topLeft())

面向对象

基础流程

因为面向对象的一部分玩意我也还不懂,所以只会跟着照抄。
只要做成以下的代码,就可以达成跟面向过程时的最基础流程一样的效果————只有一个窗口,其他一无所有:

import sys
from PyQt5.QtWidgets import QApplication, QWidget


class Example(QWidget):

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

    def initUI(self):
        self.show()


if __name__ == '__main__':

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

现在对基础流程进行一下讲解:

  1. 继续父类
class Example(QWidget):
    def __init__(self):
        super().__init__()
        ...
  1. 构造方法:
def initUI(self):
        self.show()
  1. 调用方法:
class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()    # 在这里调用构造好的方法
  1. 调用这个自己创建的对象
if __name__ == '__main__':

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

其中的大部分逻辑都跟面向过程的逻辑是一样的,所以稍作修改就可以在面向对象这里用了。

面向对象跟面向过程的区别

其实几乎没有区别...吧?
目前看来给我的感觉确实就是这样子。
只不过在面向过程时的父组件一般是w,而面向对象的父组件一般都是self
因为对象继承了QWidget,所以基本就是最上级的组件(窗口)了。

总得来说,就是面向对象会更直观且方便管理,但就使用方法而言,其实跟面向过程并无太大出入。

不过还是有一点较大的区别的,就比如想在关闭按钮的时候让用户进一步确认操作,就需要继承了QWidget了之后通过面向对象的方法来修改一个closeEvent(self, event)函数才行。

修改默认行为,在用户关闭时弹出消息盒子进行二次确认

具体操作就不想写了,看这里吧。