如何在单击窗口上的任何其他位置时从QLineEdit中删除焦点

时间:2010-12-17 00:49:40

标签: qt qt4 focus

我正在使用自定义Qt按钮,如果双击它,可以编辑按钮上的文本。双击该按钮时,会出现QLineEdit,其中按钮上的文本允许用户编辑按钮上的文本。我的要求是,如果用户点击应用程序窗口中的任何位置,QLineEdit应该消失并取消编辑操作。这在某些情况下有效。具体来说,如果我点击任何能够输入文本的内容,它就会起作用。窗口的其他部分不能按预期工作。我将点击应用程序窗口的空白部分,QLineEdit保留其焦点。如何在这些情况下删除它的重点?

5 个答案:

答案 0 :(得分:10)

我找到了一个似乎有效的解决方案,但如果有的话,我仍然愿意接受其他选择。我正在使用PyQt4,所以我的例子是python:

创建一个QLineEdit的子类,这样我就有了一个新类型。我不希望或不需要在所有QLineEdit实例上执行此操作;只是这些特定的。

class MyLineEdit(QtGui.QLineEdit):
    pass

现在,在我的QMainWindow子类中,我覆盖了mousePressEvent()实现。它获得了当前关注的小部件。如果该窗口小部件的类型为MyLineEdit,请清除焦点。

class MyMainWindow(QtGui.QMainWindow):
    def ...

    def mousePressEvent(self, event):
        focused_widget = QtGui.QApplication.focusWidget()
        if isinstance(focused_widget, MyLineEdit):
            focused_widget.clearFocus()
        QtGui.QMainWindow.mousePressEvent(self, event)

    def ...

这让我得到了我正在寻找的行为,这样如果用户点击应用程序窗口的任何地方,焦点就会被清除。


编辑:我确实发现了一个警告。我在主窗口中有一个QTreeView。如果用户单击树视图,则不会从文本编辑字段中删除焦点。

答案 1 :(得分:6)

抓住你的父窗口小部件的clicked()信号并调用yourLabel->clearFocus()(不幸的是,这不是一个插槽,使事情变得更复杂)。

答案 2 :(得分:2)

我在这里遵循了Grant Limberg的指示,但在我的例子中,我发现这很简单:

QApplication.focusWidget().clearFocus()

可以解决问题。

答案 3 :(得分:0)

如果在C ++中完成,我会做以下几点:

connect(myWidgets->MyLineEdit, SIGNAL(returnPressed()), this, SLOT(onLineEditDone());

void onLineEditDone()
{
    myWidgets->MyLineEdit->clearFocus();
}

对于这种特殊情况,我可能会使用editingFinished()代替returnPressed(),但我不会使用textChanged(QString)

答案 4 :(得分:0)

我不确定这是否也可以在Qt4中使用(我正在使用PyQt5),但是您可以更改FocusPolicyQMainWindow中的parent widget以清除焦点QLineEdit。按照https://doc.qt.io/qt-5/qwidget.html#focusPolicy-prop

我将QMainWindow的策略更改为Qt.StrongFocus,它的工作原理类似于问题中所述的功能。