【问题标题】:editable QComboBox InsertPolicy=QComboBox.AtTop doesn't insert new text可编辑的 QComboBox InsertPolicy=QComboBox.AtTop 不插入新文本
【发布时间】:2020-08-05 19:30:50
【问题描述】:

我尝试实现一个可编辑的 QComboBox。但是如果你在可编辑的 QComboBox 的 QLineEdit 中写了一个新项目,这个元素就不会出现在 QComboBox 的列表中。

我必须通过代码额外插入新文本吗?

这是我的代码:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
from PyQt5.QtWidgets import \
    QWidget, QComboBox, QApplication, QVBoxLayout, QPushButton


class MyEditableComboBox(QComboBox):
    def __init__(self, parent=None, insert_at=QComboBox.InsertAtTop):
        super().__init__(parent)

        self.setEditable(True)
        # we wanna some new data

        self.setInsertPolicy(insert_at)
        # the new text should be inserted


class Window(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        lyt = QVBoxLayout(self)
        self.setLayout(lyt)

        items = ["Burger",
                 "Chicken Wings",
                 "Pizza",
                 "Toast"]

        self.cbo = MyEditableComboBox(self)
        self.cbo.setMinimumWidth(200)
        self.cbo.addItems(items)
        lyt.addWidget(self.cbo)

        self.btn = QPushButton(self)
        self.btn.setText("Show Content of cbo")
        self.btn.clicked.connect(self._show_content_of_cbo)
        lyt.addWidget(self.btn)

    def _show_content_of_cbo(self):
        print("=" * 70)
        cbo = self.cbo
        for i in range(cbo.count()):
            print("{}: {}".format(i, cbo.itemText(i)))


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

如果您在可编辑的 QLineEdit 中插入“牛排”,然后单击按钮,我会看到输出:

======================================================================
0: Burger
1: Chicken Wings
2: Pizza
3: Toast

【问题讨论】:

    标签: python-3.x pyqt5 qcombobox


    【解决方案1】:

    简答:输入“Steak”后,按 EnterReturn 键。

    添加或不添加项目时,文档似乎不清楚。仅仅为添加它而编写是不够的,但是 QComboBox 使用 QLineEdit 的 returnPressed 信号来添加项目。因此解决方案是执行一些发出该信号的操作,例如按下 EnterReturn 键。

    【讨论】:

    • 好的,我检查过了 - 但对我来说,这似乎是一种糟糕且不方便的行为......我尝试即时实现插入...... - 谢谢
    • @jgsedi mmm,您希望在哪些事件中插入项目?
    • 我希望在离开小部件后插入新值 - 我想我会使用“focusOutEvent”。
    • @jgsedi 然后创建一个事件过滤器来检测这个事件,然后从 QLineEdit 中获取文本并将其添加到 QComboBox。
    • “事件过滤器”是什么意思?我想在“MyEditableComboBox”类中实现“focusOutEvent”,我必须检查当前文本。如果该文本不在列表中 - 所以添加它。大名单可能有问题...
    猜你喜欢
    • 2017-10-16
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    相关资源
    最近更新 更多