我正在研究一个自定义Qt按钮,该按钮允许您在双击按钮时编辑该按钮上的文本。当按钮被双击时,QLineEdit出现在按钮上的文本允许用户编辑按钮上的文本的位置。我的要求是,如果用户点击应用程序窗口中的任何地方,QLineEdit应该消失并取消编辑操作。这在某些情况下有效。具体来说,如果我点击任何能够输入文本的东西,它就可以工作。窗口的其他部分不能按预期工作。我将点击应用程序窗口的一个空白部分,并且QLineEdit保持其焦点。在这些情况下我如何消除焦点?如何在窗口上的任何其他位置点击时从QLineEdit中移除焦点
回答
我发现了一个似乎可行的解决方案,但如果有其他选项,我仍然可以开放其他选项。我使用的是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
。如果用户单击树视图,则焦点不会从文本编辑字段中移除。
抓住你的父装饰件的clicked()信号,并打电话yourLabel->clearFocus()(不幸的是,它不是一个插槽,使事情更复杂)。
定义一个你自己调用yourLabel-> clearFocus()的槽不应该太复杂。 :) – Exa 2010-12-17 13:10:53
不幸的是,只有当你在包含的小部件内部单击时才有效。根据我的需要,并非包含许多其他小部件的窗口中的任何其他位置。 – 2010-12-17 16:53:18
我跟着格兰特Limberg指令在这里,但想通了,在我的情况下,简单:
QApplication.focusWidget().clearFocus()
会解决这个问题。
如果用C++做我会做线沿线的东西:
connect(myWidgets->MyLineEdit, SIGNAL(returnPressed()), this, SLOT(onLineEditDone());
void onLineEditDone()
{
myWidgets->MyLineEdit->clearFocus();
}
因为我会用editingFinished()
代替returnPressed()
,或许这种特殊情况下,但我不会用textChanged(QString)
。
+1'clearFocus()'是我所需要的。谢谢! – 2012-03-28 15:37:25