PyQt5 QComboBox 学习笔记

PyQt5 QComboBox 下拉框学习笔记,按代码一步步来

1. 构造函数

QComboBox 的构造函数是 QComboBox(parent: QWidget = None),应用到代码中如下:

from PyQt5.Qt import *


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QComboBox 的学习")
        self.resize(500, 500)
        self.setup_ui()

    def setup_ui(self):
        cb = QComboBox(self)


if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)

    window = Window()
    window.show()
    sys.exit(app.exec_())

注意,代码中只有 cb = QComboBox(self) 这一句与生成下拉框有关,其余都是为了生成 Qt 界面窗口。之后我们只关注 QComboBox 相关代码即可。

运行后,窗口中出现一个空白的 QComboBox 下拉列表控件,后续我们可以通过操作数据的方法设置数据列表。

2. 数据操作

添加条目项

  • addItem(self, str, userData: Any = None)
  • addItem(self, QIcon, str, userData: Any = None)
  • addItems(self, Iterable[str])

插入条目项

  • insertItem(self, int, str, userData: Any = None)
  • insertItem(self, int, QIcon, str, userData: Any = None)
  • insertItems(self, int, Iterable[str])

设置条目项

  • setItemIcon(self, int, QIcon)
  • setItemText(self, int, str)
  • setItemData(self, int, Any, role: int = Qt.ItemDataRole.UserRole)

删除条目项

  • removeItem(self, int)

插分割线

  • insertSeparator(self, int)

设置当前编辑文本

  • setCurrentIndex(self, int)
  • setCurrentText(self, str)
  • setEditText(self, str)

展示代码

from PyQt5.Qt import *


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QComboBox 的学习")
        self.resize(500, 500)
        self.setup_ui()

    def setup_ui(self):
        cb = QComboBox(self)
        # 增加条目
        cb.addItem("ted 1")
        cb.addItem("ted 2")
        cb.addItems([f"ted {i}" for i in range(3,11)])
        # 设置条目
        cb.setItemText(9,"ttteed 10")
        # 插入分割线
        cb.insertSeparator(9)

        # 设置默认值
        cb.setCurrentIndex(10)
        # 按内容来匹配设置
        #cb.setCurrentText("ttteed 10")


if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)

    window = Window()
    window.show()
    sys.exit(app.exec_())

3. 数据获取

下拉框数据获取常见方法:

  • 条目总数 count(self) -> int
  • 条目图标 itemIcon(self, int) -> QIcon
  • 条目文本 itemText(self, int) -> str
  • 条目附带数据 itemData(self, int, role: int = Qt.UserRole) -> Any
  • 下拉框当前条目索引 currentIndex(self) -> int
  • 下拉框当前条目文本 currentText(self) -> str

我们通过添加一个测试按钮来获取下拉框数据并打印出来:

from PyQt5.Qt import *


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QComboBox 的学习")
        self.resize(500, 500)
        self.setup_ui()

    def setup_ui(self):
        cb = QComboBox(self)
        # 增加条目
        cb.addItems([f"ted {i}" for i in range(1,11)])

        # 添加个测试按钮来点击获取下拉框数据
        btn = QPushButton(self)
        btn.move(100,0)
        btn.setText("测试按钮")
        # 打印下拉框当前索引
        btn.clicked.connect(lambda :print(cb.currentIndex()))
        # 打印下拉框当前文本
        btn.clicked.connect(lambda: print(cb.currentText()))
        # 打印下拉框当前的附带数据
        btn.clicked.connect(lambda: print(cb.currentData()))
        # 打印下拉框总条目数
        btn.clicked.connect(lambda: print(cb.count()))
        # 获取并打印下拉框索引为8的条目文本
        btn.clicked.connect(lambda: print("索引为8的条目文本:",cb.itemText(8)))


if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)

    window = Window()
    window.show()
    sys.exit(app.exec_())

4. 数据限制

  • 设置总条目个数 setMaxCount(self, int)
  • 返回总条目个数 maxCount(self) -> int
  • 设置最大的显示个数 setMaxVisibleItems(self, int)
  • 返回最大显示个数 maxVisibleItems(self) -> int
from PyQt5.Qt import *


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QComboBox 的学习")
        self.resize(500, 500)
        self.setup_ui()

    def setup_ui(self):
        cb = QComboBox(self)

        # 设定最大条目个数
        cb.setMaxCount(5)
        # 设置最大显示个数
        cb.setMaxVisibleItems(3)
        # 设置下拉框为可编辑模式
        cb.setEditable(True)

        # 添加个测试按钮来点击增加下拉框条目
        btn = QPushButton(self)
        btn.move(100,0)
        btn.setText("添加条目")
        btn.clicked.connect(lambda :cb.addItem("ted"))


if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)

    window = Window()
    window.show()
    sys.exit(app.exec_())

注意,setMaxVisibleItems 设置需要将下拉框控件设置为可编辑模式。

5. 常规操作

可编辑

  • setEditable(self, bool)
  • isEditable(self) -> bool

可重复

是否允许有重复选项

  • setDuplicatesEnabled(self, bool)
  • duplicatesEnabled(self) -> bool

有框架

下拉框黑色边框设置

  • setFrame(self, bool)
  • hasFrame(self) -> bool

图标尺寸

  • setIconSize(self, QSize)
  • iconSize(self) -> QSize

尺寸调整策略

  • setSizeAdjustPolicy(self, QComboBox.SizeAdjustPolicy)
  • setMinimumContentsLength(self, int)

清空

  • clear(self)
  • clearEditText(self)

清空所有选项代码展示:

from PyQt5.Qt import *


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QComboBox 的学习")
        self.resize(500, 500)
        self.setup_ui()

    def setup_ui(self):
        cb = QComboBox(self)

        # 添加个测试按钮来点击增加下拉框条目
        btn = QPushButton(self)
        btn.move(100,0)
        btn.setText("添加条目")
        btn.clicked.connect(lambda :cb.addItem("ted"))

        # 添加按钮点击清空选项
        btn_clear = QPushButton(self)
        btn_clear.move(200,0)
        btn_clear.setText("清空条目")
        btn_clear.clicked.connect(cb.clear)


if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)

    window = Window()
    window.show()
    sys.exit(app.exec_())

弹出

  • showPopup(self)

通过按钮弹出下拉选项:

from PyQt5.Qt import *


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QComboBox 的学习")
        self.resize(500, 500)
        self.setup_ui()

    def setup_ui(self):
        cb = QComboBox(self)

        # 添加个测试按钮来点击增加下拉框条目
        btn = QPushButton(self)
        btn.move(100,0)
        btn.setText("添加条目")
        btn.clicked.connect(lambda :cb.addItem("ted"))

        # 添加按钮点击清空选项
        btn_clear = QPushButton(self)
        btn_clear.move(200,0)
        btn_clear.setText("清空条目")
        btn_clear.clicked.connect(cb.clear)

        # 添加按钮点击弹出选项
        btn_pop = QPushButton(self)
        btn_pop.move(300,0)
        btn_pop.setText("弹出选项")
        btn_pop.clicked.connect(cb.showPopup)

if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)

    window = Window()
    window.show()
    sys.exit(app.exec_())

完成器

在可编辑模式下,实现快速匹配的效果

  • setCompleter(self, QCompleter)
  • completer(self) -> QCompleter

验证器

  • setValidator(self, QValidator)
  • validator(self) -> QValidator

6. 信号

某个条目被选中时

必须是用户交互造成的值改变才会发射这个信号

  • activated(self, int)
  • activated(self, str)

当前选中的条目发生改变时

当前选中的索引发生改变时

既可以是由用户交互、也可以是由代码控制发生的改变

  • currentIndexChanged(self, int)
  • currentIndexChanged(self, str)

当前的文本内容发生改变时

  • currentTextChanged(self, str)

编辑的文本发生改变时

可编辑的条目

  • editTextChanged(self, str)

高亮

点开下拉菜单时,鼠标放到选项上便触发

  • highlighted(self, int)
  • highlighted(self, str)

代码展示

from PyQt5.Qt import *


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QComboBox 的学习")
        self.resize(500, 500)
        self.setup_ui()

    def setup_ui(self):
        cb = QComboBox(self)
        cb.addItems([f"ted {i}" for i in range(1,11)])

        cb.activated.connect(lambda x:print(f"条目索引 {x} 被激活"))
        cb.activated[str].connect(lambda x: print(f"条目 {x} 被激活"))

        cb.currentIndexChanged.connect(lambda x: print("当前索引发生改变",x))
        cb.currentTextChanged.connect(lambda x: print("当前文本发生改变", x))


if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)

    window = Window()
    window.show()
    sys.exit(app.exec_())

7. 思维导图

你可能感兴趣的:(Pyqt5学习)