PyQt QComboBox.setEditText保留选中/突出显示的输入文本;怎么不突出?

时间:2015-01-09 07:50:37

标签: user-interface pyqt qcombobox

更新3 - 已通过预订解决,请参阅下面的解决方案;由于问题的原因尚不清楚,所以要保持开放,我不知道解决方案有多强大。


UPDATE1:这是简短版本。

目前,在QComboBox上的.setEditText之后,我得到了这个:

enter image description here

所以你输入的下一个内容将覆盖'团队'。

但是所期望的效果是这个(未突出显示/未选中),因此您输入的下一个内容将被附加到“团队”而不是覆盖它:

enter image description here

感谢您的帮助。漫无目的的细节如下,这是原帖:

(这是所有PyQt 5.4)

UPDATE2: 显然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)

也可以在同一个类中使用keyPressEvent调用它:

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'将打开entryForm,将to_fromField设置为索引1(恰好是“TO”),将焦点放在teamField(也是一个QComboBox)上,将其文本设置为“Team”,自我设置,以便下一个按键将显示为teamField中“Team”之后的文本。

因此,从主应用程序GUI再次开始,计划是键入't3'应打开新的输入窗口,将to_fromField设置为“TO”,并将teamField设置为“Team 3”,为keypress准备Tab键的移动到entryForm中的下一个字段。

问题是,teamField.setEditText("Team ")调用会突出显示/选中所有文字,以便后续按下'3'会将"Team "替换为"3";我正在寻找一种方法来取消选中/取消选择“Team”,但是将光标保持在该字符串的右侧,以便随后按下'3'将使整个字符串"Team 3"。< / p>

想法?提前谢谢。

2 个答案:

答案 0 :(得分:1)

您可以访问组合框的行编辑,然后删除选择:

    self.entryDialog.ui.teamField.setEditText("Team ")
    self.entryDialog.ui.teamField.lineEdit().deselect()

<强>更新

上面的代码是正确的,但是当它显示后,当对象初始化其子窗口小部件的焦点处理时,它似乎会破坏它。如果使用exec()打开一个对话框,它将启动自己的事件循环,并且只有完全显示后才会处理某些事件(包括焦点事件)。这就是为什么在显示对话框

之前对子窗口小部件进行的某些更改可能会被忽略的原因。

解决此问题的一种方法是使用单次计时器确保仅在显示对话框后尝试更改。

所以在入口对话框类中添加一个方法,如下所示:

    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())

答案 1 :(得分:0)

已通过预订解决,请参阅原帖中的UPDATE3。

因此,在初始文本全部突出显示的情况下,测试显示它实际上并未认为任何内容被选中。这个解决方案只是通过反复试验偶然发现,摆弄设置和清除焦点,选择文本并尝试取消选择:

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)

请注意,在&#39; Team&#39;之后有两个空格。第二个是故意选择的。然后下一个按键将覆盖第二个空格;这基本上是理想的行为。

无论如何,它看起来像选择方案奇怪的东西;一种看待这种情况的方法是突出显示不是真正的选择,但是,如果你设置了有效的真实选择,那么它将覆盖原始突出显示的伪选择&#39;。原始突出显示的行为就像一个选择,因为按键将取代所有突出显示的内容,但是,不像选择方法显示没有选择&#39;,请参阅 UPDATE2 在原帖中。

有人可以帮忙解释一下这种行为吗?在接受这个巧合的回答之前,我想对它建立一些更多的信心。

由于