从QAction发出传递自定义窗口小部件值的信号

时间:2018-06-04 20:03:16

标签: python pyside

我使用自定义小部件创建了一个简单的菜单。如何使菜单QAction发出单击的样本的颜色值?每个颜色样本都包含一个名为“颜色”的属性。如果用户点击“重置”,我希望发出的值为“无”

我试图重载触发的信号以传递点击的色板的颜色,但它也不起作用。

enter image description here

import sys
from PySide import QtGui, QtCore


class QColorSwatch(QtGui.QPushButton):

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

    def __init__(self, *args, **kwargs):
        super(QColorSwatch, self).__init__(*args, **kwargs)
        self.setFixedWidth(18)
        self.setFixedHeight(18)
        self.setAutoFillBackground(True)
        self._color = None
        self.color = QtGui.QColor(0,0,0)
        self.pressed.connect(self.color_clicked)


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


    @color.setter
    def color(self, value):
        self._color = value

        self.setIconSize(self.size())
        pixmap = QtGui.QPixmap(self.size())
        pixmap.fill(QtCore.Qt.black)
        painter = QtGui.QPainter(pixmap)
        painter.setBrush(QtGui.QColor(self.color))
        painter.setPen(QtGui.QPen(QtCore.Qt.white, 1, QtCore.Qt.SolidLine, QtCore.Qt.RoundCap, QtCore.Qt.RoundJoin))
        painter.drawRect(1,1,self.size().width()-3,self.size().height()-3)
        painter.end()
        self.setIcon(pixmap)

        self.colorChanged.emit(value)


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


class ColorFilters(QtGui.QWidget):
    def __init__(self, action):
        super(ColorFilters,self).__init__()
        self.action = action

        self.ui_any_color = QtGui.QLabel('Reset')

        self.ui_swatch_01 = QColorSwatch()
        self.ui_swatch_01.color = QtGui.QColor(255,0,0)

        self.ui_swatch_02 = QColorSwatch()
        self.ui_swatch_02.color = QtGui.QColor(0,255,0)

        self.ui_swatch_03 = QColorSwatch()
        self.ui_swatch_03.color = QtGui.QColor(0,0,255)

        lay_main = QtGui.QGridLayout()
        lay_main.setSpacing(5)
        lay_main.setContentsMargins(5,5,5,5)
        lay_main.addWidget(self.ui_any_color,0,0,1,4)
        lay_main.addWidget(self.ui_swatch_01,1,0)
        lay_main.addWidget(self.ui_swatch_02,1,1)
        lay_main.addWidget(self.ui_swatch_03,1,2)
        self.setLayout(lay_main)

        # connections
        self.ui_swatch_01.colorClicked.connect(self.clicked_swatch)
        self.ui_swatch_02.colorClicked.connect(self.clicked_swatch)
        self.ui_swatch_03.colorClicked.connect(self.clicked_swatch)


    def mouseReleaseEvent(self,e):
        self.action.trigger()


    def clicked_swatch(self, col):
        col = self.sender().color
        self.action.trigger()


class Example(QtGui.QMainWindow):

    def __init__(self):
        super(Example, self).__init__()

        colAction = QtGui.QWidgetAction(self)
        ql = ColorFilters(colAction)
        colAction.setDefaultWidget(ql)
        colAction.triggered.connect(self.clicked_color)

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(colAction)

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Menubar')    
        self.show()

    def clicked_color(self):
        print 'Clicked'


app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())

1 个答案:

答案 0 :(得分:1)

它不会尝试使用触发信号,而是创建一个发送该信息的新信号。此外,您应该知道信号也可以连接到另一个信号,如下所示。

import sys
from PySide import QtGui, QtCore


class QColorSwatch(QtGui.QPushButton):
    colorClicked = QtCore.Signal(QtGui.QColor)
    colorChanged = QtCore.Signal(object)

    def __init__(self, *args, **kwargs):
        super(QColorSwatch, self).__init__(*args, **kwargs)
        self.setFixedWidth(18)
        self.setFixedHeight(18)
        self.setAutoFillBackground(True)
        self._color = None
        self.color = QtGui.QColor(0,0,0)
        self.pressed.connect(self.color_clicked)

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

    @color.setter
    def color(self, value):
        self._color = value

        self.setIconSize(self.size())
        pixmap = QtGui.QPixmap(self.size())
        pixmap.fill(QtCore.Qt.black)
        painter = QtGui.QPainter(pixmap)
        painter.setBrush(QtGui.QColor(self.color))
        painter.setPen(QtGui.QPen(QtCore.Qt.white, 1, QtCore.Qt.SolidLine, QtCore.Qt.RoundCap, QtCore.Qt.RoundJoin))
        painter.drawRect(1,1,self.size().width()-3,self.size().height()-3)
        painter.end()
        self.setIcon(pixmap)

        self.colorChanged.emit(value)

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


class ColorFilters(QtGui.QWidget):
    colorSelected = QtCore.Signal(QtGui.QColor) 

    def __init__(self, parent=None):
        super(ColorFilters, self).__init__(parent)
        lay_main = QtGui.QGridLayout(self)
        lay_main.setSpacing(5)
        lay_main.setContentsMargins(5,5,5,5)

        self.ui_any_color = QtGui.QLabel('Reset')
        lay_main.addWidget(self.ui_any_color,0,0,1,4)
        self.ui_any_color.installEventFilter(self)

        for i, color in enumerate((QtGui.QColor(255,0,0), QtGui.QColor(0,255,0), QtGui.QColor(0,0,255))):
            ui_swatch = QColorSwatch()
            ui_swatch.color = color
            lay_main.addWidget(ui_swatch,1,i+1)
            ui_swatch.colorClicked.connect(self.colorSelected)

    def eventFilter(self, obj, event):
        if obj == self.ui_any_color and event.type() == QtCore.QEvent.Type.MouseButtonPress:
            self.colorSelected.emit(QtGui.QColor)
        return super(ColorFilters, self).eventFilter(obj, event)


class Example(QtGui.QMainWindow):
    def __init__(self):
        super(Example, self).__init__()

        colAction = QtGui.QWidgetAction(self)
        ql = ColorFilters(self)
        colAction.setDefaultWidget(ql)
        ql.colorSelected.connect(self.clicked_color)
        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(colAction)
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Menubar')    
        self.show()

    def clicked_color(self, color):
        if not color.isValid():
            print("reset")
        else:
            print('Clicked', color)


app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())