代码之家  ›  专栏  ›  技术社区  ›  JokerMartini

从qaction发出信号,传递自定义小部件值

  •  0
  • JokerMartini  · 技术社区  · 7 年前

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

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

    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 回复  |  直到 7 年前
        1
  •  1
  •   eyllanesc Yonghwan Shin    7 年前

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

    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_())