Qt Don';自动对焦QDialog字段

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,如下所示

我正在使用QtDesigner(4.8.7)构建一个QDialog,它将作为我正在创建的QGIS插件的主要交互点。大多数用户输入是通过各种QLineEdit字段输入的,其中一些字段设置了
占位符文本

不幸的是,每次打开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
,并从对话框的任何子项中移除焦点。