我正在开发一个自定义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在主窗口有一个.如果用户单击树视图,则不会从文本编辑字段中删除焦点.
捕获你的父窗口小部件的clicked()信号并调用你的标签 - > clearFocus()(不幸的是,这不是一个插槽,使事情变得更复杂).
我遵循 Grant Limberg 的指示,但发现就我而言,一个简单的方法:
QApplication.focusWidget().clearFocus()
Run Code Online (Sandbox Code Playgroud)
会解决这个问题。