3.PyQt 部件(widgets) - 知乎

在Qt(和大多数用户界面)中,“widget”是用户可以与之交互的UI组件的名称。 用户界面由多个小部件组成,排列在窗口内。

Qt提供了大量可供选择的小部件,甚至允许您创建自己的自定义和自定义小部件。

一个快速的演示

首先,让我们看看一些最常见的PyQt小部件。 下面的代码创建了一系列PyQt小部件,并将它们添加到窗口布局中,以便您可以同时看到它们。

我们将在下一篇教程中介绍如何在Qt中进行布局。

import sys

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (
    QApplication,
    QCheckBox,
    QComboBox,
    QDateEdit,
    QDateTimeEdit,
    QDial,
    QDoubleSpinBox,
    QFontComboBox,
    QLabel,
    QLCDNumber,
    QLineEdit,
    QMainWindow,
    QProgressBar,
    QPushButton,
    QRadioButton,
    QSlider,
    QSpinBox,
    QTimeEdit,
    QVBoxLayout,
    QWidget,
)


# Subclass QMainWindow to customize your application's main window
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Widgets App")

        layout = QVBoxLayout()
        widgets = [
            QCheckBox,
            QComboBox,
            QDateEdit,
            QDateTimeEdit,
            QDial,
            QDoubleSpinBox,
            QFontComboBox,
            QLCDNumber,
            QLabel,
            QLineEdit,
            QProgressBar,
            QPushButton,
            QRadioButton,
            QSlider,
            QSpinBox,
            QTimeEdit,
        ]

        for w in widgets:
            layout.addWidget(w())

        widget = QWidget()
        widget.setLayout(layout)

        # Set the central widget of the Window. Widget will expand
        # to take up all the space in the window by default.
        self.setCentralWidget(widget)


app = QApplication(sys.argv)
window = MainWindow()
window.show()

app.exec()

运行它! 您将看到出现一个窗口,其中包含我们创建的所有小部件。

让我们从上到下看看所有的小部件示例:

|

还有比这更多的小部件,但它们不太适合! 你可以通过查看Qt文档来了解它们。

接下来,我们将逐步介绍一些最常用的小部件,并对它们进行更详细的研究。 为了试验这些小部件,我们需要一个简单的应用程序来放置它们。 将以下代码保存到一个名为app.py的文件中,并运行它以确保它能够工作。

import sys
from PyQt5.QtWidgets import (
    QMainWindow, QApplication,
    QLabel, QCheckBox, QComboBox, QListBox, QLineEdit,
    QLineEdit, QSpinBox, QDoubleSpinBox, QSlider
)
from PyQt5.QtCore import Qt

class MainWindow(QMainWindow):

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

        self.setWindowTitle("My App")


app = QApplication(sys.argv)
w = MainWindow()
w.show()
app.exec()

在上面的代码中,我们已经导入了大量Qt小部件。 现在,我们将依次遍历这些小部件,将它们添加到应用程序中,并查看它们的行为。

QLabel

我们将从QLabel开始,它可以说是Qt工具箱中可用的最简单的小部件之一。 这是一个简单的一行文本,您可以在应用程序中定位它。 你可以在创建文本时传入一个str来设置文本:

widget = QLabel("Hello")

或者,通过使用.setText()方法:

widget = QLabel("1")  # The label is created with the text 1.
widget.setText("2")   # The label now shows 2.

您还可以调整字体参数,例如小部件中的字体大小或文本对齐方式。

class MainWindow(QMainWindow):

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

        self.setWindowTitle("My App")

        widget = QLabel("Hello")
        font = widget.font()
        font.setPointSize(30)
        widget.setFont(font)
        widget.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter)

        self.setCentralWidget(widget)

QLabel on Windows, Mac & Ubuntu Linux.

字体提示:如果你想要改变一个小部件字体的属性,通常最好是获取当前字体,更新它,然后应用它。 这确保了字体外观与桌面惯例保持一致。

对齐是通过使用来自Qt.名称空间的标志指定的。 用于水平对齐的标志有:

可供垂直对齐的标志有:

您可以使用管道(|)将标志组合在一起,但是请注意,一次只能使用垂直或水平对齐标志。

align_top_left = Qt.AlignLeft | Qt.AlignTop

注意,您使用OR管道(' | ')来合并两个标志(而不是A & B).这是因为标志是不重叠的位掩码。 例如:Qt.AlignmentFlag.AlignLeft的十六进制值为0x0001,而Qt.AlignmentFlag.AlignBottom的十六进制值为0x0040。 通过使用操作运算符,我们得到值0x0041,表示‘左下角’。 这一原则适用于所有其他组合Qt标志。 如果这对你来说是胡言乱语,请忽略它,继续前进。 记住要用|

最后,还有一个速记标志,它同时在两个方向上居中:

奇怪的是,您还可以使用. setpixmap()使用QLabel来显示图像。 它接受一个pixmap,你可以通过传递一个图像文件名给QPixmap来创建它。 在本书提供的示例文件中,你可以找到一个文件otje.jpg,你可以在窗口中显示它,如下所示:

"Otje" the cat.

多么可爱的脸。 默认情况下,图像缩放同时保持其长宽比。 如果你想要它伸展和缩放以完全适应窗口,你可以在QLabel上设置。setscaledcontents (True)。

widget.setScaledContents(True)

QCheckBox

下一个要查看的小部件是QCheckBox(),顾名思意,它向用户显示了一个可选中的框。 然而,与所有Qt小部件一样,有许多可配置的选项可以更改小部件的行为。

class MainWindow(QMainWindow):

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

        self.setWindowTitle("My App")

        widget = QCheckBox()
        widget.setCheckState(Qt.Checked)

        # For tristate: widget.setCheckState(Qt.PartiallyChecked)
        # Or: widget.setTriState(True)
        widget.stateChanged.connect(self.show_state)

        self.setCentralWidget(widget)


    def show_state(self, s):
        print(s == Qt.Checked)
        print(s)

QCheckBox on Windows, Mac & Ubuntu Linux.

您可以使用. setchecked或. setcheckstate以编程方式设置复选框状态。 前者接受True或False,分别表示已选中或未选中。 然而,在使用.setCheckState时,你还可以使用Qt. namespace标志指定一个特定的检查状态:

支持部分选中(Qt.PartiallyChecked)状态的复选框通常被称为“三态”,即既不开启也不关闭。 处于这种状态的复选框通常显示为灰色复选框,通常用于将子项链接到父复选框的分层复选框安排中。

如果您将该值设置为Qt.PartiallyChecked,则复选框将变为三态。 你也可以通过使用. settrstate (True)将复选框设置为tristate,而不将当前状态设置为部分选中状态。

您可能会注意到,当脚本运行时,当前状态号显示为一个int, checked = 2, unchecked = 0, partially checked = 1。 您不需要记住这些值,例如Qt.Checked名称空间变量== 2。 这是这些州各自旗帜的值。 这意味着你可以使用state == Qt.Checked来测试状态。

QComboBox

QComboBox是一个下拉列表,默认情况下用箭头关闭以打开它。 您可以从列表中选择单个项目,当前选择的项目显示为小部件上的一个标签。 组合框适合于从一长列选项中选择一个选项。

您可能已经见过在字处理应用程序中用于选择字体或大小的组合框。 尽管Qt实际上提供了一个特定的字体选择组合框,如QFontComboBox。

你可以通过传递一个字符串列表到. additems()来添加项目到QComboBox。 项目将按照提供的顺序添加。

class MainWindow(QMainWindow):

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

        self.setWindowTitle("My App")

        widget = QComboBox()
        widget.addItems(["One", "Two", "Three"])

        # Sends the current index (position) of the selected item.
        widget.currentIndexChanged.connect( self.index_changed )

        # There is an alternate signal to send the text.
        widget.textChanged.connect( self.text_changed )

        self.setCentralWidget(widget)


    def index_changed(self, i): # i is an int
        print(i)

    def text_changed(self, s): # s is a str
        print(s)

QComboBox on Windows, Mac & Ubuntu Linux.

当前选中的项目被更新时,. currentindexchanged信号被触发,默认情况下,将所选项目的索引传递到列表中。 还有一个. currenttextchanged信号,它提供了当前选中项的标签,这通常更有用。

QComboBox还可以编辑,允许用户输入当前不在列表中的值,并插入它们,或只是作为一个值使用。 要使框可编辑:

widget.setEditable(True)

您还可以设置一个标志来确定如何处理插入。 这些标志存储在QComboBox类本身,如下所示:

要使用这些,请按如下方式应用该标志:

widget.setInsertPolicy(QComboBox.InsertAlphabetically)

你也可以通过使用. setmaxcount来限制盒子中允许的项目的数量,例如。

widget.setMaxCount(10)

要更深入地了解QComboBox,请查看我的QComboBox文档。

QListWidget

这个小部件类似于QComboBox,除了选项显示为一个可滚动的项目列表。 它还支持一次选择多个项目。 QListWidget提供了一个currentItemChanged信号,它发送qlisttitem(列表小部件的元素),以及一个currentTextChanged信号,它发送当前项目的文本。

class MainWindow(QMainWindow):

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

        self.setWindowTitle("My App")

        widget = QListWidget()
        widget.addItems(["One", "Two", "Three"])

        widget.currentItemChanged.connect(self.index_changed)
        widget.currentTextChanged.connect(self.text_changed)

        self.setCentralWidget(widget)


    def index_changed(self, i): # Not an index, i is a QListItem
        print(i.text())

    def text_changed(self, s): # s is a str
        print(s)

QLineEdit

QLineEdit小部件是一个简单的单行文本编辑框,用户可以在其中输入输入。 它们用于表单字段或没有有效输入限制列表的设置。 例如,当输入电子邮件地址或计算机名时。

class MainWindow(QMainWindow):

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

        self.setWindowTitle("My App")

        widget = QLineEdit()
        widget.setMaxLength(10)
        widget.setPlaceholderText("Enter your text")

        #widget.setReadOnly(True) # uncomment this to make readonly

        widget.returnPressed.connect(self.return_pressed)
        widget.selectionChanged.connect(self.selection_changed)
        widget.textChanged.connect(self.text_changed)
        widget.textEdited.connect(self.text_edited)

        self.setCentralWidget(widget)


    def return_pressed(self):
        print("Return pressed!")
        self.centralWidget().setText("BOOM!")

    def selection_changed(self):
        print("Selection changed")
        print(self.centralWidget().selectedText())

    def text_changed(self, s):
        print("Text changed...")
        print(s)

    def text_edited(self, s):
        print("Text edited...")
        print(s)

QLineEdit on Windows, Mac & Ubuntu Linux.

如上面的代码所示,您可以在行编辑中设置文本的最大长度。

QLineEdit有许多信号可用于不同的编辑事件,包括当(用户)按下返回时,当用户选择改变时。 还有两个编辑信号,一个用于框中的文本已被编辑,一个用于框中的文本已被更改。 这里的区别在于用户编辑和编程更改之间的区别。 textEdited信号只在用户编辑文本时发送。

此外,还可以使用输入掩码来执行输入验证,以定义支持哪些字符以及在哪里。 这可以应用到以下领域:

widget.setInputMask('000.000.000.000;_')

上面的方法允许一系列以句点分隔的3位数字,因此可以用来验证IPv4地址。

QSpinBox and QDoubleSpinBox

QSpinBox提供了一个带有箭头的小型数值输入框来增加和减少数值。 QSpinBox支持整数,而相关小部件QDoubleSpinBox支持浮点数。

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("My App")

        widget = QSpinBox()
        # Or: widget = QDoubleSpinBox()

        widget.setMinimum(-10)
        widget.setMaximum(3)
        # Or: widget.setRange(-10,3)

        widget.setPrefix("$")
        widget.setSuffix("c")
        widget.setSingleStep(3)  # Or e.g. 0.5 for QDoubleSpinBox
        widget.valueChanged.connect(self.value_changed)
        widget.textChanged.connect(self.value_changed_str)

        self.setCentralWidget(widget)

    def value_changed(self, i):
        print(i)

    def value_changed_str(self, s):
        print(s)

运行它,你会看到一个数字输入框。 该值显示前后固定单元,范围为+3到-10。

QSpinBox on Windows, Mac & Ubuntu Linux.

上面的演示代码显示了小部件可用的各种特性。

要设置可接受值的范围,你可以使用setMinimum和setMaximum,或者也可以同时使用setRange来设置。 值类型的注释支持前缀和后缀,它们可以添加到数字上,例如,对于货币标记或单位,分别使用. setprefix和. setsuffix。

单击小部件上的向上和向下箭头将增加或减少小部件中的值的数量,这可以使用. setsinglestep设置。 请注意,这对小部件可接受的值没有影响。

QSpinBox和QDoubleSpinBox都有一个. valuechanged信号,当它们的值被改变时就会触发。 原始的. valuechanged信号发送数字值(int或float),而. textchanged将值作为字符串发送,包括前缀和后缀字符。

QSlider

QSlider提供了一个滑条小部件,其内部功能与QDoubleSpinBox非常相似。 不是用数字显示当前值,而是用滑块句柄沿小部件长度的位置表示。 当提供两个极端之间的调整,但不需要绝对精度时,这通常是有用的。 这种类型的小部件最常见的用途是音量控制。

还有一个额外的. slidermoved信号,当滑块移动位置时触发,还有一个. sliderpressed信号,当滑块被点击时触发。

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("My App")

        widget = QSlider()

        widget.setMinimum(-10)
        widget.setMaximum(3)
        # Or: widget.setRange(-10,3)

        widget.setSingleStep(3)

        widget.valueChanged.connect(self.value_changed)
        widget.sliderMoved.connect(self.slider_position)
        widget.sliderPressed.connect(self.slider_pressed)
        widget.sliderReleased.connect(self.slider_released)

        self.setCentralWidget(widget)

    def value_changed(self, i):
        print(i)

    def slider_position(self, p):
        print("position", p)

    def slider_pressed(self):
        print("Pressed!")

    def slider_released(self):
        print("Released")

运行这个,你会看到一个滑块小部件。 拖动滑块可更改值。

您还可以通过在创建时传入方向来构造一个具有垂直或水平方向的滑块。 方向标志在Qt.名称空间中定义。 例如——

widget.QSlider(Qt.Vertical)

或者--

widget.QSlider(Qt.Horizontal)

QDial

最后,QDial是一个可旋转的小部件,功能就像滑块,但看起来像一个模拟拨号。 这看起来不错,但从UI的角度来看,并不是特别友好。 然而,它们经常被用于音频应用程序作为真实世界模拟拨号的代表。

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("My App")

        widget = QDial()
        widget.setRange(-10, 100)
        widget.setSingleStep(0.5)

        widget.valueChanged.connect(self.value_changed)
        widget.sliderMoved.connect(self.slider_position)
        widget.sliderPressed.connect(self.slider_pressed)
        widget.sliderReleased.connect(self.slider_released)

        self.setCentralWidget(widget)

    def value_changed(self, i):
        print(i)

    def slider_position(self, p):
        print("position", p)

    def slider_pressed(self):
        print("Pressed!")

    def slider_released(self):
        print("Released")

运行这个,你会看到一个圆形表盘,旋转它从范围中选择一个数字。

信号与QSlider相同,并保留相同的名称(例如. slidermoved)。

总结

这就结束了我们对PyQt应用程序中常用小部件的简要介绍。 要查看可用小部件的完整列表,包括它们的所有信号和属性,请查看


原网址: 访问
创建于: 2024-05-23 18:01:04
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论