2012-02-05 3 views
1

Je vais d'abord montrer le code.PyQt4: QLabel avec bouton d'effacement

class XLineEdit(QtGui.QLineEdit): 
    '''QLineEdit with clear button, which appears when user enters text.''' 
    def __init__(self, pixmap, parent=None): 
    QtGui.QLineEdit.__init__(self, parent) 
    self.layout = QtGui.QHBoxLayout(self) 
    self.image = QtGui.QLabel(self) 
    self.image.setCursor(QtCore.Qt.ArrowCursor) 
    self.image.setFocusPolicy(QtCore.Qt.NoFocus) 
    self.image.setStyleSheet("border: none;") 
    self.image.setPixmap(pixmap) 
    self.image.setSizePolicy(
     QtGui.QSizePolicy.Expanding, 
     QtGui.QSizePolicy.Expanding) 
    self.image.adjustSize() 
    self.image.setScaledContents(True) 
    self.layout.addWidget(
     self.image, alignment=QtCore.Qt.AlignRight) 
    self.textChanged.connect(self.changed) 
    self.image.hide() 

    def changed(self, text): 
    if len(text) > 0: 
     self.image.show() 
    else: # if entry is empty 
     self.image.hide() 

Cela crée un objet QLineEdit avec le bouton personnalisé de QLabel sur le côté droit de QLineEdit. J'ai seulement deux problèmes:

  1. Si je change la police de XLineEdit ("objet XLineEdit" .setFont (QFont)), le bouton d'image bien paraître par vertical, mais regardera laid par horizontal. Il semble que la taille verticale change en changeant la taille de la police de QLineEdit, mais pas la taille horizontale. Comment puis-je réparer cela? Y a-t-il un autre moyen de créer QLineEdit avec le bouton Effacer? J'ai essayé de créer QPushButton avec QIcon personnalisé, mais l'icône ne change pas du tout sa taille (ni verticale, ni horizontale).

  2. Comment puis-je créer un nouveau signal lorsque l'utilisateur clique sur QLabel? Il semble qu'il n'y ait pas d'analogue pour "cliqué" sur QPushButton.

Merci!

+1

Avez-vous essayé d'utiliser un QToolButton pour l'image que vous voulez cliquable? http://doc.qt.nokia.com/4.7-snapshot/qtoolbutton.html – gfortune

+2

Jetez un oeil à cet exemple [Lineedit avec un bouton d'effacement] (http://labs.qt.nokia.com/2007/06/ 06/lineedit-avec-un-clear-button /). Mais il est écrit en C++. – reclosedev

+0

@gfortune: merci, je vais essayer. – ghostmansd

Répondre

1

Alors que @reclosedev déjà formulé des observations sur votre question avec un lien vers un C++ par exemple pour l'aspect bouton clair, je voulais ajouter des informations sur votre deuxième question ...

Vous pouvez créer un cliquable QLabel par la surcharge MousePressEvent et émettant votre propre signal personnalisé.

de PyQt4.QtCore importation pyqtSignal de PyQt4.QtGui importation QLabel, QStyle

class ClickLabel(QLabel): 

    clicked = pyqtSignal() 

    def __init__(self, *args, **kwargs) 
     super(ClickLabel, self).__init__(*args, **kwargs) 

    def mousePressEvent(self, event): 
     event.accept() 
     self.clicked.emit() 

Un commentaire sur le lien C de qui a été prévu dans l'autre commentaire. Au lieu d'utiliser un HBoxLayout, ils parent directement le bouton au widget QLabel et utilisent resizeEvent pour toujours le déplacer vers le côté droit du QLabel.

+0

merci, maintenant les choses deviennent claires. :-) Mais je ne comprends pas pourquoi dans init part nous utilisons * args, ** kwargs et super. Puis-je écrire dans '__init__' comme ceci:' def __init __ (self, parent = None): QLabel .__ init __ (auto, parent) '? – ghostmansd

+0

Il est également possible de le faire sans sous-classe: 'self.image.mouseReleaseEvent = self.on_image_clicked' Et' def on_image_clicked (self, event): ... '. Mais c'est un peu sale. – reclosedev