PyQt5 QSpinBox – 访问对象名称

  • Post category:Python

PyQt5是基于Qt的Python GUI编程框架,其中包括了许多实用的GUI部件,如QSpinBox,用于提供一个带有上下箭头控制按钮的数字输入框部件。在使用QSpinBox时,我们可以给其设置对象名称,从而在程序中方便地引用并访问这个QSpinBox对象。

设置对象名称

在PyQt5中,我们可以通过setObjectName()方法来为QWidget对象设置对象名称,其中QWidget是所有PyQt5部件的基类。具体用法如下:

spin_box.setObjectName('my_spin_box')

在上述示例中,我们为QSpinBox部件设置了一个对象名称‘my_spin_box’。

访问对象名称

访问对象名称可以通过调用findChild()方法或findChildren()方法来实现,这两种方法可以通过给定对象名称和选项来在QWidget中查找对象。findChild()方法返回指定对象名称的第一个对象,而findChildren()方法返回所有匹配对象名称的对象组成的列表。具体用法如下:

my_spin_box = main_window.findChild(QtWidgets.QSpinBox, 'my_spin_box')

上述示例中,我们在mainwindow中查找对象名称为‘my_spin_box’的第一个QSpinBox对象,并将其赋值给my_spin_box变量。

my_spin_boxes = main_window.findChildren(QtWidgets.QSpinBox, 'my_spin_box')

上述示例中,我们在mainwindow中查找所有对象名称为‘my_spin_box’的QSpinBox对象,并将其组成的列表赋值给my_spin_boxes变量。

示例说明

下面是两个基本的示例说明。

示例一

import sys
from PyQt5 import QtWidgets

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.setGeometry(200, 200, 400, 200)
        spin_box = QtWidgets.QSpinBox(self, minimum=0, maximum=100)
        spin_box.setGeometry(150, 50, 100, 30)
        spin_box.setObjectName('spin_box')
        button = QtWidgets.QPushButton(self, text='Click', 
            clicked=lambda: self.on_button_click(spin_box))
        button.setGeometry(150, 100, 100, 30)

    def on_button_click(self, spin_box):
        value = spin_box.value()
        QtWidgets.QMessageBox.information(self, 'Info', 
            f'The current value is {value}.')

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

在上述示例中,我们创建了一个主窗口,并在窗口中添加了一个QSpinBox部件和一个QPushButton部件。我们为QSpinBox部件设置了对象名称‘spin_box’,并通过clicked信号连接了on_button_click()函数(当按钮被点击时执行该函数)。在on_button_click()函数中,我们通过查找对象名为‘spin_box’的QSpinBox部件来获取其当前值,并通过QMessageBox弹窗显示该值。

示例二

import sys
from PyQt5 import QtWidgets

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.setGeometry(200, 200, 400, 200)
        spin_box1 = QtWidgets.QSpinBox(self, minimum=0, maximum=100)
        spin_box1.setGeometry(150, 50, 100, 30)
        spin_box1.setObjectName('spin_box')
        spin_box2 = QtWidgets.QSpinBox(self, minimum=-100, maximum=0)
        spin_box2.setGeometry(150, 100, 100, 30)
        spin_box2.setObjectName('spin_box')
        button = QtWidgets.QPushButton(self, text='Click', 
            clicked=lambda: self.on_button_click())
        button.setGeometry(150, 150, 100, 30)

    def on_button_click(self):
        spin_boxes = self.findChildren(QtWidgets.QSpinBox, 'spin_box')
        values = [spin_box.value() for spin_box in spin_boxes]
        sum_values = sum(values)
        QtWidgets.QMessageBox.information(self, 'Info', 
            f'The sum of values is {sum_values}.')

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

在上述示例中,我们创建了一个主窗口,并在窗口中添加了两个QSpinBox部件和一个QPushButton部件。我们为QSpinBox部件设置了相同的对象名称‘spin_box’,并通过clicked信号连接了on_button_click()函数(当按钮被点击时执行该函数)。在on_button_click()函数中,我们通过查找所有对象名为‘spin_box’的QSpinBox部件来获取它们的当前值,并计算它们的和,最后通过QMessageBox弹窗显示总和。由于我们给两个QSpinBox部件设置了相同的对象名称‘spin_box’,因此在查找QSpinBox部件时,我们可以使用findChildren()方法来一次性获取所有对象。