PyQt5 QSpinBox – 如何通过字体获得被隐藏的文本

  • Post category:Python

PyQt5是Python编程语言的GUI编程工具箱。QSpinBox是PyQt5中的一个部件,它提供了一个可以增加或减少数字值的单行文本输入框。

在QSpinBox中,如果输入的值太大,那么部件将隐藏前几个数字而只显示后几个数字。要查看被隐藏的文本,我们可以使用字体信息。

以下是获取被隐藏文本的方法:

  1. 获取部件中所有文本的字体宽度
  font = spin_box.font()
  font_metrics = QtGui.QFontMetrics(font)
  text_width = font_metrics.width(spin_box.text())
  1. 获取整个部件的宽度并将文本宽度与其进行比较。如果文本宽度大于部件宽度,则使用字体信息揭示被隐藏的文本。
  if text_width > spin_box.width():
      font = spin_box.font()
      elided_text = font_metrics.elidedText(spin_box.text(), QtCore.Qt.ElideLeft, spin_box.width())
      print(f"被隐藏的文本是: {elided_text}")

接下来,我们将使用两个示例说明。

示例1:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QSpinBox, QWidget, QVBoxLayout, QPushButton
from PyQt5.QtGui import QFontMetrics, QFont
from PyQt5.QtCore import Qt

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.spin_box = QSpinBox(self)
        self.btn_check = QPushButton("检查隐藏的文本", self)
        self.btn_check.clicked.connect(self.check_text)
        central_widget = QWidget()
        layout = QVBoxLayout()
        layout.addWidget(self.spin_box)
        layout.addWidget(self.btn_check)
        central_widget.setLayout(layout)
        self.setCentralWidget(central_widget)

    def check_text(self):
        font = self.spin_box.font()
        font_metrics = QFontMetrics(font)
        text_width = font_metrics.width(self.spin_box.text())
        if text_width > self.spin_box.width():
            elided_text = font_metrics.elidedText(self.spin_box.text(), Qt.ElideLeft, self.spin_box.width())
            print(f"被隐藏的文本是: {elided_text}")


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

这个示例程序创建了一个主窗口,并在窗口中创建了一个QSpinBox和一个QPushButton。当用户单击“检查隐藏的文本”按钮时,会查找并打印出被隐藏的文本。

示例2:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QGridLayout, QLabel, QSpinBox
from PyQt5.QtGui import QFontMetrics, QFont
from PyQt5.QtCore import Qt

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.grid_layout = QGridLayout()
        self.grid_layout.addWidget(QLabel("数字:"), 0, 0)
        self.spin_box = QSpinBox(self)
        self.grid_layout.addWidget(self.spin_box, 0, 1)
        self.grid_layout.addWidget(QLabel("隐藏文本:"), 1, 0)
        self.hidden_text_label = QLabel(self)
        self.grid_layout.addWidget(self.hidden_text_label, 1, 1)
        central_widget = QWidget()
        central_widget.setLayout(self.grid_layout)
        self.setCentralWidget(central_widget)

        self.spin_box.valueChanged.connect(self.update_hidden_text)

    def update_hidden_text(self):
        font = self.spin_box.font()
        font_metrics = QFontMetrics(font)
        text_width = font_metrics.width(self.spin_box.text())
        if text_width > self.spin_box.width():
            elided_text = font_metrics.elidedText(self.spin_box.text(), Qt.ElideLeft, self.spin_box.width())
            self.hidden_text_label.setText(elided_text)
        else:
            self.hidden_text_label.clear()

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

这个示例程序创建了一个主窗口,以及一个带有QSpinBox和一个标签的网格布局。在每次QSpinBox中的值发生变化时,程序将在标签上更新隐藏的文本。