Qt Don';自动对焦QDialog字段
我正在使用QtDesigner(4.8.7)构建一个QDialog,它将作为我正在创建的QGIS插件的主要交互点。大多数用户输入是通过各种QLineEdit字段输入的,其中一些字段设置了Qt Don';自动对焦QDialog字段,qt,pyqt,qt4,pyqt4,qt-designer,Qt,Pyqt,Qt4,Pyqt4,Qt Designer,我正在使用QtDesigner(4.8.7)构建一个QDialog,它将作为我正在创建的QGIS插件的主要交互点。大多数用户输入是通过各种QLineEdit字段输入的,其中一些字段设置了占位符文本 不幸的是,每次打开QDialog时,都会立即选择QLineEdit字段(即它接收焦点),这会导致占位符文本消失,以便用户输入文本。因此,我想知道是否有可能创建一个不会自动聚焦于任何字段的QDialog。 这将允许我的插件的最终用户在输入任何值之前检查占位符文本 我目前正在初始化QDialog,如下所示
占位符文本
不幸的是,每次打开QDialog时,都会立即选择QLineEdit字段(即它接收焦点),这会导致占位符文本消失,以便用户输入文本。因此,我想知道是否有可能创建一个不会自动聚焦于任何字段的QDialog。
这将允许我的插件的最终用户在输入任何值之前检查占位符文本
我目前正在初始化QDialog,如下所示:
import PyQt4.QtGui as QTG
import PyQt4.QtCore as QTC
from dialog_ui import Ui_dialog
class UI (object):
def __init__(self, iface):
# iface is just a way to interact with QGIS
self.iface = iface
self.container = QTG.QDialog()
self.ui = Ui_dialog()
self.setup()
def setup(self):
self.ui.setupUi(self.container)
# Custom ui setup code follows after this...
# Called by an external function
def show(self):
self.container.exec_()
在Qt设计器中使用
在一些没有占位符文本的小部件上启动选项卡排序。该小部件将获得初始焦点
或者,在显示对话框之前,只需在适当的小部件上调用setFocus()
在一些没有占位符文本的小部件上启动选项卡排序。该小部件将获得初始焦点
或者,在显示对话框之前,只需在适当的小部件上调用setFocus()。解决方案的要点是在QLineEdit上使用clearFocus()
,强制它失去焦点
我决定在用户单击总体QDialog的另一个位置时使QLineEdit失去焦点。代码最终如下所示:
import PyQt4.QtGui as QTG
import PyQt4.QtCore as QTC
from dialog_ui import Ui_dialog
class CustomDialog (QTG.QDialog):
def mousePressEvent(self, event):
focusWidget = QTG.QApplication.focusWidget()
if focusWidget:
focusWidget.clearFocus()
class UI (object):
def __init__(self, iface):
# iface is just a way to interact with QGIS
self.iface = iface
self.container = CustomDialog()
self.ui = Ui_dialog()
# Rest of the code remains unchanged
我最终选择了Ekhumaro的答案和我找到的解决方案的组合。解决方案的要点是在QLineEdit上使用clearFocus()
,强制它失去焦点
我决定在用户单击总体QDialog的另一个位置时使QLineEdit失去焦点。代码最终如下所示:
import PyQt4.QtGui as QTG
import PyQt4.QtCore as QTC
from dialog_ui import Ui_dialog
class CustomDialog (QTG.QDialog):
def mousePressEvent(self, event):
focusWidget = QTG.QApplication.focusWidget()
if focusWidget:
focusWidget.clearFocus()
class UI (object):
def __init__(self, iface):
# iface is just a way to interact with QGIS
self.iface = iface
self.container = CustomDialog()
self.ui = Ui_dialog()
# Rest of the code remains unchanged
这在一开始起作用,但一旦用户选择任何字段,问题就会再次出现。@mathsaey。是的-这就是为什么我给出了调用setFocus()
;-)的替代解决方案这在一开始起作用,但一旦用户选择任何字段,问题就会再次出现。@mathsaey。是的-这就是为什么我给出了调用setFocus()
;-)的替代解决方案与其绑定到MousePresseEvent
并假设这是改变焦点的唯一方式,不如绑定到QApplication::focusChanged
并从对话框的任何子级移除焦点。与其绑定到MousePresseEvent
并假设这是改变焦点的唯一方式,您应该绑定到QApplication::focusChanged
,并从对话框的任何子项中移除焦点。