User interface PyQt QComboBox.setEditText将选中/突出显示输入的文本;如何解除照明?
更新3-保留解决方案,请参阅下面的我的解决方案;因为问题的原因还不清楚,我不知道这个解决方案有多可靠User interface PyQt QComboBox.setEditText将选中/突出显示输入的文本;如何解除照明?,user-interface,pyqt,qcombobox,User Interface,Pyqt,Qcombobox,更新3-保留解决方案,请参阅下面的我的解决方案;因为问题的原因还不清楚,我不知道这个解决方案有多可靠 更新1:以下是简短版本 目前,在QComboBox上的.setEditText之后,我得到以下结果: 因此,您键入的下一个内容将覆盖“Team” 但理想的效果是(未高亮/未选中),这样您键入的下一个内容将附加到“Team”中,而不是覆盖它: 谢谢你的帮助。下面是原始帖子的详细内容: (这都是PyQt 5.4) 更新2: 显然,python并不认为实际选择了任何内容: self.en
更新1:以下是简短版本 目前,在QComboBox上的.setEditText之后,我得到以下结果: 因此,您键入的下一个内容将覆盖“Team” 但理想的效果是(未高亮/未选中),这样您键入的下一个内容将附加到“Team”中,而不是覆盖它: 谢谢你的帮助。下面是原始帖子的详细内容: (这都是PyQt 5.4) 更新2: 显然,python并不认为实际选择了任何内容:
self.entryForm.ui.teamField.lineEdit().setText("Team ")
print("selected text:"+self.entryForm.ui.teamField.lineEdit().selectedText())
打印“选定文本:”而不打印其他内容。要确保该功能正常工作,请执行以下操作:
self.entryForm.ui.teamField.lineEdit().setText("Team ")
self.entryForm.ui.teamField.lineEdit().setSelection(0,4)
print("selected text:"+self.entryForm.ui.teamField.lineEdit().selectedText())
打印“所选文本:团队”
因此,这可能就是为什么许多影响选择的方法没有按预期工作(.deselect(),.setSelection(5,5)等,甚至一些其他方法也会出现意外行为,即cursorForward(False,1)或cursorBackward(False,1)等
原创帖子:
这是针对无线电日志GUI的,因此键盘交互必须最少且直观。openNewEntryForm(以下)被称为主应用程序GUI窗口上按钮的插槽:
self.ui.pushButton.clicked.connect(self.openNewEntryDialog)
也可以使用同一类中的按键事件调用它:
def keyPressEvent(self,event):
if type(event)==QKeyEvent:
print("QKeyEvent:"+str(event.key()))
if event.key()==Qt.Key_T:
self.openNewEntryDialog('t')
event.accept()
else:
event.ignore()
下面是有问题的方法:
def openNewEntryDialog(self,key=None):
self.entryDialog=newEntryDialog()
if key=='t':
self.entryDialog.ui.to_fromField.setCurrentIndex(1)
self.entryDialog.ui.teamField.setFocus()
self.entryDialog.ui.teamField.setEditText("Team ")
if self.entryDialog.exec_():
self.newEntry(self.entryDialog.getValues()) # adds the log entry
因此,预期的按键顺序是(从主应用程序GUI窗口):
只需按一次键盘上的“t”键即可打开入口窗体,将to_fromField设置为索引1(恰好是“to”),将焦点放在teamField(也是一个QComboBox),将其文本设置为“Team”,并自行设置,以便下一次按键将显示为teamField中“Team”后面的文本
因此,再次从主应用程序GUI开始,计划是键入“t3”应打开新的输入窗口,将to_fromField设置为“to”,并将teamField设置为“Team 3”,以便按tab键进入entryForm中的下一个字段
问题是,teamField.setEditText(“Team”)
调用会突出显示/选择所有文本,因此随后按'3'
键将“Team”
替换为“3”
;我正在寻找一种取消突出显示/取消选择“Team”的方法但将光标保持在该字符串右侧的活动状态,以便随后按下'3'
键将使整个字符串成为“Team 3”
想法?提前谢谢。您可以访问组合框的行编辑,然后删除所选内容:
self.entryDialog.ui.teamField.setEditText("Team ")
self.entryDialog.ui.teamField.lineEdit().deselect()
更新:
上面的代码是正确的,但似乎对话框在显示后初始化其子窗口小部件的焦点处理时会将其关闭。如果使用exec()
打开对话框,它将启动自己的事件循环和一些事件(包括焦点事件)只有在完全显示后才会处理。这就是为什么在显示对话框之前对子窗口小部件所做的某些更改可能会被忽略的原因
解决此问题的一种方法是使用单次触发计时器,以确保仅在显示对话框后才尝试更改
因此,向entry dialog类添加一个方法,如下所示:
def resetUI(self, key):
if key == 't':
self.ui.to_fromField.setCurrentIndex(1)
self.ui.teamField.setFocus()
self.ui.teamField.setEditText('Team ')
QtCore.QTimer.singleShot(0, self.ui.teamField.lineEdit().deselect)
def openNewEntryDialog(self, key=None):
self.entryDialog = newEntryDialog()
self.entryDialog.resetUI(key)
if self.entryDialog.exec_():
self.newEntry(self.entryDialog.getValues())
然后像这样使用它:
def resetUI(self, key):
if key == 't':
self.ui.to_fromField.setCurrentIndex(1)
self.ui.teamField.setFocus()
self.ui.teamField.setEditText('Team ')
QtCore.QTimer.singleShot(0, self.ui.teamField.lineEdit().deselect)
def openNewEntryDialog(self, key=None):
self.entryDialog = newEntryDialog()
self.entryDialog.resetUI(key)
if self.entryDialog.exec_():
self.newEntry(self.entryDialog.getValues())
有保留地解决,请参阅原始帖子中的更新3 因此,当初始文本全部突出显示时,测试表明它实际上并不认为选择了任何内容。这个解决方案只是在反复尝试后偶然发现的,它需要设置和清除焦点,选择文本并尝试取消选择:
def openNewEntryDialog(self,key=None):
self.entryForm=newEntryDialog()
if key=='t':
self.entryForm.ui.to_fromField.setCurrentIndex(1)
self.entryForm.ui.teamField.lineEdit().setFocus()
self.entryForm.ui.teamField.lineEdit().setText("Team ")
self.entryForm.ui.teamField.lineEdit().setSelection(5,1)
请注意,“Team”后面有两个空格,第二个空格是有意选择的。然后,下一次按键将覆盖第二个空格;这基本上是所需的行为
不管怎么说,选择方案看起来有些古怪;一种看这一点的方法是,高亮显示并不是真正的选择,但是,如果设置了有效的真实选择,那么它将覆盖原始高亮显示的“伪选择”。原始高亮显示的行为类似于选择,按键将替换所有的选择突出显示,但与选择不同,选择方法显示没有“选择”,请参见原始帖子中的更新2
有人能帮我解释一下这种行为吗?在接受这个巧合的答案之前,我想对它建立更多的信心
感谢这似乎不起作用。感谢您介绍如何使用lineEdit(),但似乎很多QLineEdit类方法的行为都不符合预期。只要您为setSelection指定一个或多个字符的范围,它就会起作用;home(False)和end(False)以及deselect()所有文本都保持高亮显示/选中状态。我将继续尝试lineEdit对象的各种方法。很有趣,谢谢。那么,您认为我偶然发现的解决方案仍然受到竞争条件的影响,因此不可靠吗?@TomGrundy。很难说:您必须跟踪Qt源代码,以查看到底发生了什么以及顺序。H不过,我想说,您当前的解决方案并没有真正解决原始问题,因为它没有完全清除所选内容。它还依赖于输入文本的特定知识(例如,其长度),所以不是一个通用的解决方案。嗯,这两方面都很正确。无论如何,谢谢你的解决方案,也谢谢你提供的线索,这些线索导致了另一个附带的解决方案。