【问题标题】:How to remove focus from a QLineEdit when anyplace else on the window is clicked单击窗口上的任何其他位置时如何从 QLineEdit 中移除焦点
【发布时间】:2020-11-18 19:51:53
【问题描述】:

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

【问题讨论】:

    标签: qt qt4 focus


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 定义一个你自己调用 yourLabel->clearFocus() 的槽应该不会太复杂。 :)
      • 不幸的是,这仅在您单击包含的小部件内部时才有效。不是,正如我所要求的,窗口上包含许多其他小部件的其他任何地方。
      【解决方案3】:

      我在这里遵循了格兰特林伯格的指示,但发现就我而言,这是一个简单的:

      QApplication.focusWidget().clearFocus()
      

      会解决问题。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 谢谢!这为我解决了问题。
        【解决方案5】:

        如果在 C++ 中完成,我会按照以下方式做一些事情:

        connect(myWidgets->MyLineEdit, SIGNAL(returnPressed()), this, SLOT(onLineEditDone());
        
        void onLineEditDone()
        {
            myWidgets->MyLineEdit->clearFocus();
        }
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-18
          • 2012-02-15
          • 1970-01-01
          相关资源
          最近更新 更多