2010-12-17 281 views
5

我正在研究一个自定义Qt按钮,该按钮允许您在双击按钮时编辑该按钮上的文本。当按钮被双击时,QLineEdit出现在按钮上的文本允许用户编辑按钮上的文本的位置。我的要求是,如果用户点击应用程序窗口中的任何地方,QLineEdit应该消失并取消编辑操作。这在某些情况下有效。具体来说,如果我点击任何能够输入文本的东西,它就可以工作。窗口的其他部分不能按预期工作。我将点击应用程序窗口的一个空白部分,并且QLineEdit保持其焦点。在这些情况下我如何消除焦点?如何在窗口上的任何其他位置点击时从QLineEdit中移除焦点

回答

8

我发现了一个似乎可行的解决方案,但如果有其他选项,我仍然可以开放其他选项。我使用的是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。如果用户单击树视图,则焦点不会从文本编辑字段中移除。

+0

+1'clearFocus()'是我所需要的。谢谢! – 2012-03-28 15:37:25

4

抓住你的父装饰件的clicked()信号,并打电话yourLabel->clearFocus()(不幸的是,它不是一个插槽,使事情更复杂)。

+1

定义一个你自己调用yourLabel-> clearFocus()的槽不应该太复杂。 :) – Exa 2010-12-17 13:10:53

+1

不幸的是,只有当你在包含的小部件内部单击时才有效。根据我的需要,并非包含许多其他小部件的窗口中的任何其他位置。 – 2010-12-17 16:53:18

2

我跟着格兰特Limberg指令在这里,但想通了,在我的情况下,简单:

QApplication.focusWidget().clearFocus() 

会解决这个问题。

0

如果用C++做我会做线沿线的东西:

connect(myWidgets->MyLineEdit, SIGNAL(returnPressed()), this, SLOT(onLineEditDone()); 

void onLineEditDone() 
{ 
    myWidgets->MyLineEdit->clearFocus(); 
} 

因为我会用editingFinished()代替returnPressed(),或许这种特殊情况下,但我不会用textChanged(QString)