2016-06-21 86 views
0

我正在使用QtDesigner(4.8.7)來構建一個QDialog,它將作爲我創建的QGIS插件的主要交互點。大部分用戶輸入都是通過各種QLineEdit字段輸入的,其中一些字段有placeholderText集。不要自動對焦QDialog字段

不幸的是,每次打開QDialog時,立即選擇一個QLineEdit字段(即它接收焦點),導致placeholderText消失,以便允許用戶輸入文本。因此,我想知道是否可以創建一個不會自動關注任何字段的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_() 

回答

3

使用在Qt Designer中的Tab Order Editing Mode

在沒有佔位符文本的某個小部件上啓動tab排序。該小部件將獲得最初的重點。

或者,只需在顯示對話框之前在適當的小部件上調用setFocus()即可。

+0

這起作用最初,但問題一旦用戶選擇任何領域時再次發生。 – mathsaey

+2

@mathsaey。是的 - 這就是爲什麼我給調用'setFocus()';-)的替代解決方案 – ekhumoro

0

我最終選擇了ekhumoro的答案和我找到的解決方案here。解決方案的要點是在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 
+0

而不是綁定到'mousePressEvent',並假設它是焦點可能改變的唯一方式,您應該綁定到'QApplication :: focusChanged'並從對話的任何孩子中移除焦點。 –