如何在 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.setPlaceholderText?
如何从 QComboBox 中获取所选项目以显示在 PyQt5 的 QTableWidget 中? (QComboBox 有复选框来选择项目)