我正在使用自定义Qt按钮,如果双击它,可以编辑按钮上的文本。双击该按钮时,会出现QLineEdit
,其中按钮上的文本允许用户编辑按钮上的文本。我的要求是,如果用户点击应用程序窗口中的任何位置,QLineEdit
应该消失并取消编辑操作。这在某些情况下有效。具体来说,如果我点击任何能够输入文本的内容,它就会起作用。窗口的其他部分不能按预期工作。我将点击应用程序窗口的空白部分,QLineEdit
保留其焦点。如何在这些情况下删除它的重点?
答案 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),但是您可以更改FocusPolicy
或QMainWindow
中的parent widget
以清除焦点QLineEdit
。按照https://doc.qt.io/qt-5/qwidget.html#focusPolicy-prop
我将QMainWindow
的策略更改为Qt.StrongFocus
,它的工作原理类似于问题中所述的功能。