2017-09-04 5 views
0

J'ai un problème avec PyQt4. J'ai une classe qui hérite de QWidget. Cette classe utilise une disposition pour stocker un QLabel et un QLineEdit. Voici le code:PyQt4 - Application d'une feuille de style sur un objet héritant de QWidget

class SearchBar(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(SearchBar, self).__init__(parent) 
     self.setStyleSheet(SEARCHBAR_STYLE) 

     layout = QtGui.QHBoxLayout() 
     layout.setSpacing(0) 
     layout.setMargin(0) 
     layout.addStrut(SEARCHAR_HEIGHT) 

     lbl_notification = QtGui.QLabel('Hi') 
     lbl_notification.setStyleSheet(SEARCHBAR_NOTIFICATION_STYLE) 
     layout.addSpacing(10) 
     layout.addWidget(lbl_notification) 

     searchbox = QLineEdit('Search') 
     layout.addStretch() 
     layout.addWidget(searchbox) 
     layout.addSpacing(10) 

     self.setLayout(layout) 

et voici la feuille de style:

SEARCHBAR_STYLE = """ 
        QWidget { 
         background: #424a7d; 
        } 
        .QWidget { 
         border: 1px solid grey; 
        } 
        QLabel { 
         border-top: 1px solid grey; 
         border-bottom: 1px solid grey; 
        } 
        """ 

Maintenant, mon problème est que la feuille de style ne concerne pas la façon dont je voudrais à. Il applique uniquement sur mon QLabel quand la frontière devrait être autour de l'ensemble de l'objet:

enter image description here

Quand j'avais une fonction créer ma barre de recherche en QWidget, il a parfaitement fonctionné, mais maintenant que je l'ai changé cela à un classe ça ne marche pas. Qu'est-ce que je fais mal?

EDIT: Je suis en train de réaliser ceci:

enter image description here

EDIT 2: Le code précédent, avant que je change à une classe, était le suivant:

def create_bar(): 
    layout = QtGui.QHBoxLayout() 
    layout.setSpacing(0) 
    layout.setMargin(0) 
    layout.addStrut(SEARCHAR_HEIGHT) 

    lbl_notification = QtGui.QLabel('Hi') 
    lbl_notification.setStyleSheet(SEARCHBAR_NOTIFICATION_STYLE) 
    layout.addSpacing(10) 
    layout.addWidget(lbl_notification) 

    search_bar = QtGui.QLineEdit('Search') 
    search_bar.setMinimumSize(200, 25) 
    search_bar.setMaximumSize(200, 25) 
    search_bar.setStyleSheet(SEARCHBOX_STYLE) 

    layout.addStretch() 
    layout.addWidget(search_bar) 
    layout.addSpacing(10) 

    widget = QtGui.QWidget() 
    widget.setStyleSheet(SEARCHBAR_STYLE) 
    widget.setLayout(layout) 
    return widget 
+0

qu'est-ce que 'SearchBox'? – eyllanesc

+0

Quand vous dites ce qui suit: ** changé cela en classe **, que voulez-vous dire? – eyllanesc

+0

@eyllanesc SearchBox est une classe qui hérite de QLineEdit et qui possède certaines fonctions de remplacement pour répondre à mes besoins. Je l'ai laissé hors de question parce que je ne pense pas que c'est pertinent à mon problème –

Répondre

2

Modifier la base classe de SearchBar de QWidget à QFrame, ou bien implémenter un style sheet aware paintEvent:

def paintEvent(self, event): 
    opt = QStyleOption() 
    opt.initFrom(self) 
    painter = QPainter(self) 
    self.style().drawPrimitive(QStyle.PE_Widget, opt, painter, self) 

Puis changer la feuille de style à

SEARCHBAR_STYLE = """ 
SearchBar { 
    background: #424a7d; 
    border: 1px solid grey; 
} 
"""