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