如何在 QComboBox 中标记当前项目文本?

Posted

技术标签:

【中文标题】如何在 QComboBox 中标记当前项目文本?【英文标题】:how to mark current item text in QComboBox? 【发布时间】:2020-10-17 01:20:23 【问题描述】:

我将组合框用作带有历史记录的简单命令行。

这是信号槽的定义:

QtWidgets.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_Return),
                    self.comboBox_cmd,
                    activated=self.queryLine)

...和插槽:

@QtCore.pyqtSlot()
def queryLine(self):
    '''
    Read cmd string from widget and write to device.
    '''
    ## comboBox can be enhanced with a history
    cmd = self.comboBox_cmd.currentText()
    cmds = [self.comboBox_cmd.itemText(i) for i in range(self.comboBox_cmd.count())]
    if not cmds or cmds[-1] != cmd:
    self.comboBox_cmd.addItem(cmd)
    self.query(cmd)

这真的很好用。现在,如何在按 Enter 后标记当前项的整个文本,以便我可以根据需要替换整行?

【问题讨论】:

“标记”是指选择文本吗?无论如何,你为什么要使用那个功能?当您按 Enter 时,将自动添加尚未在其模型中的项目。 是的,我的意思是选择。确实,新项目会自动添加到列表中,这不是我的问题。我将此框用作串行设备的命令行。有时我想多次发送相同的命令(只需按回车键),有时我想发送一个全新的命令。现在,我必须先删除最后一个命令,然后才能输入 new。选择文本意味着,我可以简单地开始输入。 【参考方案1】:

您可以通过按回车键自动选择行编辑的文本:

class SelectCombo(QtWidgets.QComboBox):
    def keyPressEvent(self, event):
        # call the base class implementation
        super().keyPressEvent(event)
        # if return/enter is pressed, select the text afterwards
        if event.key() in (QtCore.Qt.Key_Return, QtCore.Qt.Key_Enter):
            self.lineEdit().selectAll()

【讨论】:

这看起来很有希望,不幸的是我不知道如何使用它。我已经添加了你的类,在我的 GUI 类中,我简单地将 QComboBox(由 QtDesigner 定义)替换为 __init__:self.comboBox_cmd = SelectCombo() 显然,这还不够...... 澄清一下:我现在已将 QComboBox 小部件提升为建议的 SelectCombo 小部件。我的代码中的其他所有内容都保持不变。我在 keyPressEvent 方法中添加了一个简单的打印函数,用于简单的调试。该小部件已被明确使用,但不如预期:按 Enter 不会触发 keyPressEvent 方法,但所有其他键都会触发(从打印中可以清楚地看到)。但是,它们不会选择文本。我在这里不知所措,非常感谢任何进一步的帮助,在此先感谢! 如果你还有 QShortcut,它会“吃掉”这个事件。如果你想保留你的答案,那很好,但为了将来参考,请等待你的 cmets 的答案,或提供更多说明,因为你的新答案并没有真正改变这个答案中已经说过的内容,而且你使用了自定义信号与手头的主题完全无关。 对不起,我找不到如何捕捉它的输入按下信号,我需要在我的 GUI 中对其进行操作。我知道,我没有问这个,所以我道歉。我会接受你的回答,希望一切顺利。【参考方案2】:

好的,我已经组装好了 :) 问题是,我之前需要定义一个快捷方式,因为 QComboBox 没有 returnPressed 属性。 当然,使用自定义小部件,我可以轻松更改:

class SelectCombo(QtWidgets.QComboBox):
'''
https://***.com/questions/62594748/how-to-mark-current-item-text-in-qcombobox/62598381
Modified QComboBox which selects the current text after Enter/Return.
'''
returnPressed = QtCore.pyqtSignal(str)

def keyPressEvent(self, event):
    ## call the base class implementation
    super().keyPressEvent(event)
    ## if return/enter is pressed, select the text afterwards
    if event.key() in (QtCore.Qt.Key_Return, QtCore.Qt.Key_Enter):
        self.lineEdit().selectAll()
        self.returnPressed.emit("Enter pressed!")

在我的 GUI 应用程序中,我只需要以下信号槽定义即可使其工作:

    ## 1) QLineEdit has "returnPressed" but no history
    #self.lineEdit_cmd.returnPressed.connect(self.queryLine)
    ## 2) QComboBox has history, but no "returnPressed" attritbute==> need to define a shortcut
    #QtCore.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_Return),
    #QtWidgets.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_Return),
    #                    self.comboBox_cmd,
    #                    activated=self.queryLine)
    ## 3) custom SelectCombo widget has QComboBox's history plus "returnPressed"
    self.comboBox_cmd.returnPressed.connect(self.queryLine)

非常感谢您帮助我!

【讨论】:

以上是关于如何在 QComboBox 中标记当前项目文本?的主要内容,如果未能解决你的问题,请参考以下文章

Qt,如何更改 QComboBox 的一项的文本颜色? (C++)

QComboBox 动作教程?

如何使用 QComboBox.setPlaceholderText?

Qt - 如何在 QComboBox 中使用富文本?

如何为 QComboBox 中的每个项目添加价值 [重复]

如何从 QComboBox 中获取所选项目以显示在 PyQt5 的 QTableWidget 中? (QComboBox 有复选框来选择项目)