2009-12-12 8 views
0

Python 2.5.4 PyQt4PyQt4 QSpinBox.selectAll() ne fonctionne pas comme prévu

I sous-classé un QDoubleSpinBox pour émettre un signal sur un événement focusIn:



#Custom widgets for DPL GUI 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class DPLDoubleSpinBox(QDoubleSpinBox): 

    __pyqtSignals__ = ("valueChanged(double)", "focusIn()") 

    def __init__(self, *args): 
     QDoubleSpinBox.__init__(self, *args) 

    def event(self, event): 
     if(event.type()==QEvent.FocusIn): 
      self.emit(SIGNAL("focusIn()")) 
      #self.clear() Works as expected 
      self.selectAll() #See below     

     return QDoubleSpinBox.event(self, event) 

if __name__ == "__main__": 

    import sys 

    app = QApplication(sys.argv) 
    widget = DPLDoubleSpinBox() 
    widget2 = DPLDoubleSpinBox() 
    widget.show() 
    widget2.show() 
    sys.exit(app.exec_()) 

Si vous cliquez dans un boîte, puis tuez l'autre fenêtre, cela fonctionne. Si vous cliquez à l'intérieur de l'un, puis l'autre, puis se concentrer toute autre fenêtre sur le bureau, il semble fonctionner. Je pense que c'est un problème de mise au point, mais je ne peux pas le localiser. J'en ai juste besoin pour tout sélectionner lorsqu'on clique dessus. J'ai essayé de le faire à travers son pointeur d'édition de ligne, mais j'obtiens les mêmes résultats. Essayé de forcer l'accent sur d'autres widgets, mais toujours le même résultat.

Vous pouvez connecter un emplacement personnalisé au déclenchement lorsqu'il émet "focusIn()". Vous pouvez alors anyQSpinBox.selectAll(), et cela fonctionne, mais pas sur lui-même.

Répondre

0

j'ai changé l'événement pour QEvent.Enter

Maintenant, il self.selectAll()

Je peux sortir avec cela parce qu'il est pour une application de l'écran tactile, il ne serait pas évident pour l'utilisateur que quelque chose ne tourne pas rond . J'aimerais toujours savoir ce qui me manque, ou si c'est juste un bug.

2

Je sais que cette question date de plus de deux ans, mais comme c'est l'un des premiers résultats pour googler "qspinbox select on focus", je voudrais laisser une solution pour les générations futures.

Le problème est le comportement de QSpinBox.lineEdit(). Avec le focusInEvent, vous pouvez appeler selectAll(), mais pour une raison quelconque, le mousePressEvent de QLineEdit efface la sélection juste après l'événement focus. Voir here pour une explication.

La solution consiste à installer un filtre d'événements pour le widget QSpinBox.lineEdit() ou la sous-classe QLineEdit et à appeler QSpinBox.setLineEdit(). De toute façon, le link above vous montrera comment atteindre le comportement souhaité en gardant un drapeau booléen et en filtrant à la fois focusInEvent et mousePressEvent.

Questions connexes