ZetCode

PyQt QComboBox

最后修改于 2023 年 8 月 24 日

在本文中,我们将展示如何使用 QComboBox 部件。

访问 Advanced PyQt5 电子书,阅读 PyQt6 教程,或列出所有 PyQt 教程

PyQt QComboBox

QComboBox 是一个为用户提供选项列表的部件,它以占用最少屏幕空间的方式工作。组合框是一个显示当前项目的选择部件。它可以弹出一个可选项目的列表。

组合框可以是可编辑的,也可以包含图标。

当用户在组合框中选择一个项目时,会发出 activated 信号。

QComboBox 示例

下面的示例在旁边的标签中显示了选定的项目。

simple.py
#!/usr/bin/python

import sys

from PyQt6.QtWidgets import (QWidget, QLabel, QHBoxLayout,
                             QComboBox, QApplication)


class Example(QWidget):

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

        self.initUI()

    def initUI(self):

        self.distros = ['Debian', 'Xubuntu', 'Fedora', 'Arch', 'Gentoo']

        hbox = QHBoxLayout()

        self.lbl = QLabel('Ubuntu', self)

        combo = QComboBox(self)

        for distro in self.distros:
            combo.addItem(distro)

        combo.activated.connect(self.onActivated)

        hbox.addWidget(combo)
        hbox.setSpacing(20)

        hbox.addWidget(self.lbl)
        self.setContentsMargins(20, 20, 20, 20)
        self.setLayout(hbox)

        self.move(300, 300)
        self.setWindowTitle('QComboBox')
        self.show()

    def onActivated(self, idx):

        self.lbl.setText(self.distros[idx])
        self.lbl.adjustSize()


def main():

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


if __name__ == '__main__':
    main()

我们有一个组合框和一个标签。选中的项目会显示在标签中。

combo = QComboBox(self)

for distro in self.distros:
    combo.addItem(distro)

使用 addItem 添加一个新项目。

combo.activated.connect(self.onActivated)

我们将 self.onActivated 处理程序连接到 activate 信号。

def onActivated(self, idx):

    self.lbl.setText(self.distros[idx])
    self.lbl.adjustSize()

在事件处理程序中,我们将选定的文本设置到标签上,并调整标签的大小以适应文本。

QComboBox
图:QComboBox

QComboBox 图标

在下面的示例中,我们在组合框中显示带有文本的图标。

icons.py
#!/usr/bin/python

import sys
from PyQt6.QtWidgets import (QWidget, QHBoxLayout,
                             QComboBox, QApplication)
from PyQt6.QtGui import QIcon


class Example(QWidget):

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

        self.initUI()

    def initUI(self):

        hbox = QHBoxLayout()

        combo = QComboBox(self)
        combo.addItem('Disk')
        combo.setItemIcon(0, QIcon('disk.png'))
        
        combo.addItem('Web')
        combo.setItemIcon(1, QIcon('web.png'))

        combo.addItem('Computer')
        combo.setItemIcon(2, QIcon('computer.png'))

        hbox.addWidget(combo)
        hbox.setSpacing(20)
    
        self.setContentsMargins(20, 20, 20, 20)
        self.setLayout(hbox)

        self.setGeometry(300, 300, 250, 180)
        self.setWindowTitle('QComboBox')
        self.show()


def main():
    
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()

图标通过 setItemIcon 方法设置。

Displaying icons in QComboBox
图:在 QComboBox 中显示图标

QComboBox 查找文本

findItemText 方法返回包含给定文本的项目的索引。如果未找到文本,则返回 -1。

finding.py
#!/usr/bin/python

import sys

from PyQt6.QtWidgets import (QWidget, QLineEdit, QHBoxLayout, QPushButton,
                             QComboBox, QApplication)

class Example(QWidget):

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

        self.initUI()

    def initUI(self):

        hbox = QHBoxLayout()

        data = ['sky', 'cloud', 'grass', 'water', 'glass', 'forest', 
            'rock', 'light', 'brittle', 'water', 'smoke']

        self.combo = QComboBox(self)
        self.combo.setMinimumWidth(90)
        self.combo.addItems(data)

        self.lineEdit = QLineEdit()
        self.lineEdit.setMinimumWidth(90)

        btn = QPushButton("Find")
        btn.clicked.connect(self.onClicked)

        hbox.addWidget(self.combo)
        hbox.setSpacing(20)
        hbox.addWidget(self.lineEdit)
        hbox.setSpacing(20)

        hbox.addWidget(btn)

        self.setContentsMargins(20, 20, 20, 20)
        self.setLayout(hbox)

        self.move(300, 300)
        self.setWindowTitle('QComboBox')
        self.show()

    def onClicked(self):

        data = self.lineEdit.text()
        idx = self.combo.findText(data)

        if idx != -1:
            self.combo.setCurrentIndex(idx)


def main():

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


if __name__ == '__main__':
    main()

在此示例中,我们有一个组合框、一个行编辑器和一个按钮。我们搜索在行编辑器中输入的指定文本。如果找到了项目文本,它将作为当前文本项显示。

data = ['sky', 'cloud', 'grass', 'water', 'glass', 'forest', 
    'rock', 'light', 'brittle', 'water', 'smoke']

self.combo = QComboBox(self)
self.combo.setMinimumWidth(90)
self.combo.addItems(data)

多个项目通过 addItems 插入。

def onClicked(self):

    data = self.lineEdit.text()
    idx = self.combo.findText(data)

    if idx != -1:
        self.combo.setCurrentIndex(idx)

当我们点击按钮时,onClicked 处理程序被调用。我们使用 text 获取输入的文本。然后我们找到具有该文本的项目的索引。最后,我们使用 setCurrentIndex 设置当前项目。

在本文中,我们介绍了 PyQt 的 QComboBox 部件。

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已经撰写了超过 1400 篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出所有 PyQt 教程