2017-12-04 5 views
1

Wie kann ich die QPushbutton in Pyside Subklasse, aber erfordern ein arg. In meinem Beispiel brauche ich arg als Liste von Ints [0,0,0].Unterklasse QPushbutton mit verschiedenen Argumenten

Mein Ziel ist es so zu machen, i MyButton wie folgt zu erstellen:

# GOAL 
MyButton([0,255,0]) 

Wenn die arguement die Liste der Werte enthält, in übergeben wird, sollte er den Wert self._data gesetzt. Ich bin mir nicht sicher, ob ich dieses Setup richtig eingerichtet habe, daher werden Korrekturen gerne gesehen.

class MyButton(QtGui.QPushButton): 

    def __init__(self, *args, **kwargs): 
     super(MyButton, self).__init__(*args, **kwargs) 

     self._data = stuff 

    @property 
    def data(self): 
     return self._data 

    @data.setter 
    def data(self, value): 
     self._data = value 


MyButton([0,255,0]) 

Aktualisiert: Ich dachte, dann bemerkt, wenn ich diesen Wert in meine Init übergeben Sie es nicht den Setter auszulösen für diese Eigenschaft angezeigt wird ?? Warum das? Wenn Sie den folgenden Code testen, wird die Farbe der Schaltfläche bei der Instanziierung nicht angezeigt. Wie repariere ich das?

import os 
import sys 
import json 
from PySide import QtCore, QtGui 


class QColorSwatch(QtGui.QPushButton): 

    colorClicked = QtCore.Signal(list) 
    colorChanged = QtCore.Signal(list) 

    def __init__(self, stuff, *args, **kwargs): 
     super(QColorSwatch, self).__init__(*args, **kwargs) 

     self._color = stuff 
     self.setMaximumWidth(22) 
     self.setMaximumHeight(22) 
     self.setAutoFillBackground(True) 
     self.pressed.connect(self.color_clicked) 

    @property 
    def color(self): 
     return self._color 

    @color.setter 
    def color(self, value): 
     self._color = value 
     pixmap = QtGui.QPixmap(self.size()) 
     pixmap.fill(QtGui.QColor(value[0], value[1], value[2])) 
     self.setIcon(pixmap) 
     self.colorChanged.emit(value) 
     # swatch.setIconSize(pixmap.size() - QtCore.QSize(6,6)) 

    def color_clicked(self): 
     self.colorClicked.emit(self.color) 



class ExampleWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(ExampleWindow, self).__init__(parent) 
     self.resize(300, 200) 

     self.ui_swatch = QColorSwatch([255,0,0]) 

     # main layout 
     main_layout = QtGui.QVBoxLayout() 
     main_layout.setContentsMargins(5,5,5,5) 
     main_layout.setSpacing(5) 
     main_layout.addWidget(self.ui_swatch) 

     main_widget = QtGui.QWidget() 
     main_widget.setLayout(main_layout) 
     self.setCentralWidget(main_widget) 

     # Signals 
     self.ui_swatch.colorClicked.connect(self.color_clicked) 
     self.ui_swatch.colorChanged.connect(self.color_changed) 

    def color_clicked(self, col): 
     print 'CLICKED:', col 
     self.ui_swatch.color = [255,0,0] 

    def color_changed(self, col): 
     print 'CHANGED:', col 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    ex = ExampleWindow() 
    ex.show() 
    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 

Antwort

3

Sie müssen stuff als Parameter eingeben.

class MyButton(QtGui.QPushButton): 
    def __init__(self, stuff, *args, **kwargs): 
     super(MyButton, self).__init__(*args, **kwargs) 

     self._data = stuff 

    @property 
    def data(self): 
     return self._data 

    @data.setter 
    def data(self, value): 
     self._data = value 

if __name__ == '__main__': 

    app = QtGui.QApplication(sys.argv) 
    mainWin = MyButton([0,255,0]) 
    print(mainWin.data) 
    mainWin.show() 
    sys.exit(app.exec_()) 

Update:

Sie haben self.color zu verwenden, um den Setter zu verwenden.

class QColorSwatch(QtGui.QPushButton): 

    colorClicked = QtCore.Signal(list) 
    colorChanged = QtCore.Signal(list) 

    def __init__(self, stuff, *args, **kwargs): 
     super(QColorSwatch, self).__init__(*args, **kwargs) 
     self._color = None 
     self.color = stuff 
     self.setMaximumWidth(22) 
     self.setMaximumHeight(22) 
     self.setAutoFillBackground(True) 
     self.pressed.connect(self.color_clicked) 

    @property 
    def color(self): 
     return self._color 

    @color.setter 
    def color(self, value): 
     self._color = value 
     pixmap = QtGui.QPixmap(self.size()) 
     pixmap.fill(QtGui.QColor(value[0], value[1], value[2])) 
     self.setIcon(pixmap) 
     self.colorChanged.emit(value) 
     # swatch.setIconSize(pixmap.size() - QtCore.QSize(6,6)) 

    def color_clicked(self): 
     self.colorClicked.emit(self.color) 
+0

Sie sind überall :) Danke für Ihre Hilfe – JokerMartini

+0

Ich bemerkte es nicht die Farbe der Schaltfläche, um richtig eingestellt, obwohl scheint meine Daten auszulösen. – JokerMartini

+0

@JokerMartini Ich habe bereits meine Antwort aktualisiert. – eyllanesc

Verwandte Themen