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

Gra*_*erg 10 qt focus qt4

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

Gra*_*erg 10

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

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

class MyLineEdit(QtGui.QLineEdit):
    pass
Run Code Online (Sandbox Code Playgroud)

现在,在我的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 ...
Run Code Online (Sandbox Code Playgroud)

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


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


Sep*_*ram 6

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

  • 不幸的是,这仅在您单击包含的小部件时才有效。正如我所要求的,不是包含许多其他小部件的窗口上的任何其他地方。 (2认同)

Adr*_* Jr 5

我遵循 Grant Limberg 的指示,但发现就我而言,一个简单的方法:

QApplication.focusWidget().clearFocus()
Run Code Online (Sandbox Code Playgroud)

会解决这个问题。