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

Qt 如何在单击窗口上的任何其他位置时从QLineEdit中移除焦点,qt,qt4,focus,Qt,Qt4,Focus,我正在开发一个定制的Qt按钮,如果双击它,可以编辑按钮上的文本。双击按钮时,出现一个QLineEdit,其中按钮上的文本允许用户编辑按钮上的文本。我的要求是,如果用户单击应用程序窗口中的任何位置,则QLineEdit应消失并取消编辑操作。这在某些情况下有效。具体地说,如果我点击任何能够输入文本的东西,它就会工作。窗口的其他部分无法按预期工作。我将单击应用程序窗口的空白部分,QLineEdit保留其焦点。在这种情况下,我怎样才能消除它的焦点呢?捕获父窗口小部件的clicked()信号并在那里调用(

我正在开发一个定制的Qt按钮,如果双击它,可以编辑按钮上的文本。双击按钮时,出现一个
QLineEdit
,其中按钮上的文本允许用户编辑按钮上的文本。我的要求是,如果用户单击应用程序窗口中的任何位置,则
QLineEdit
应消失并取消编辑操作。这在某些情况下有效。具体地说,如果我点击任何能够输入文本的东西,它就会工作。窗口的其他部分无法按预期工作。我将单击应用程序窗口的空白部分,
QLineEdit
保留其焦点。在这种情况下,我怎样才能消除它的焦点呢?

捕获父窗口小部件的clicked()信号并在那里调用(不幸的是,这不是一个插槽,使事情变得更复杂)。

我找到了一个似乎可行的解决方案,尽管如果有其他选择,我仍然愿意接受。我使用的是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
。如果用户单击树状视图,则不会从文本编辑字段中删除焦点。

我遵循Grant Limberg的说明,但在我的例子中,我发现了一个简单的:

QApplication.focusWidget().clearFocus()

将解决这个问题。

< P>如果在C++中完成,我将沿着以下的方式做一些事情:

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

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

对于这种特殊情况,我可能会使用
editingFinished()
而不是
returnPressed()
,但我不会使用
textChanged(QString)
我不确定这是否也适用于Qt4(我使用的是PyQt5)但是您可以更改
qmain窗口的
FocusPolicy
parent小部件的
FocusPolicy
以清除
QLineEdit
中的焦点。依照


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

定义一个自己的插槽,在其中调用标签->clearFocus()应该不会太复杂。:)不幸的是,只有在包含小部件的内部单击时,这才有效。正如我所要求的,在包含许多其他窗口小部件的窗口中,其他任何地方都没有。