PyQt5 QSpinBox – 获取动作被调用的对象

  • Post category:Python

PyQt5是Python语言的一种GUI编程框架,并且其中的QSpinBox组件可以用于创建一个可供用户设置数值的交互式控件。在使用QSpinBox组件时,有时候需要获取当前SpinBox组件中的数值、获取动作被调用的对象等信息,这里介绍如何获取动作被调用的对象。

1. 基本概念

在PyQt5中,可以通过以下两种方式获取动作被调用的对象:

  • sender():返回当前信号的发送者对象。
  • QObject.sender():返回当前接收器(即槽函数)的对象。

2. 使用示例

下面通过两条示例来详细讲解如何使用QSpinBox组件获取动作被调用的对象。

(1)获取QSpinBox组件当前值

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QSpinBox, QLabel

class MainWindow(QMainWindow):

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

        self.spin_box = QSpinBox(self)
        self.spin_box.setGeometry(50, 50, 100, 30)
        self.spin_box.setValue(10)
        self.spin_box.valueChanged.connect(self.display_value)

        self.label = QLabel(self)
        self.label.setGeometry(50, 100, 100, 30)

    def display_value(self):
        sender = self.sender()
        self.label.setText(f'当前值为:{sender.value()}')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

在这个示例中,我们创建了一个QSpinBox组件,并设置了初始值为10。用户通过旋转SpinBox组件中的数字,可以改变其值。同时,我们创建了一个QLabel组件,用于显示SpinBox组件当前的值。

当用户旋转SpinBox组件中的数字时,QSpinBox组件将会发送valueChanged信号,并调用display_value槽函数来获取当前QSpinBox组件对象的值,并将其显示到Label组件中。

其中,sender()函数获取的是调用当前槽函数的对象,也就是QSpinBox组件的对象,因此我们可以通过sender().value()的方式获取当前的值。

(2)获取QSpinBox组件被按下的键

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QMainWindow, QSpinBox, QLabel

class MainWindow(QMainWindow):

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

        self.spin_box = QSpinBox(self)
        self.spin_box.setGeometry(50, 50, 100, 30)
        self.spin_box.setButtonSymbols(QSpinBox.NoButtons)
        self.spin_box.installEventFilter(self)

        self.label = QLabel(self)
        self.label.setGeometry(50, 100, 200, 30)

    def eventFilter(self, obj, event):
        if obj == self.spin_box and event.type() == Qt.KeyPress:
            key = event.key()
            if key == Qt.Key_Up:
                self.label.setText('向上键被按下')
            elif key == Qt.Key_Down:
                self.label.setText('向下键被按下')
            return True
        return super().eventFilter(obj, event)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

在这个示例中,我们创建了一个QSpinBox组件,并设置其没有按钮。我们通过installEventFilter(self)为其安装了一个事件过滤器,以监听按键事件。

当用户按下向上键或向下键时,QSpinBox组件将会触发事件,并将其发送给该组件。在eventFilter函数中,我们判断当前事件是否为KeyPress事件以及对象是否为QSpinBox组件,如果是则判断按下的键,根据不同的键设置label组件的文本,最后返回True表示事件被处理了。

在这个示例中,我们不需要获取当前QSpinBox组件的对象,因为我们只需要判断用户按下的键。