首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从传递自定义小部件值的QAction发出信号

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

Stack Overflow用户
提问于 2018-06-05 04:03:16
回答 1查看 193关注 0票数 0

我已经使用自定义小部件创建了一个简单的菜单。如何使menu QAction发出所点击样本的颜色值?每个色样都包含一个名为“color”的属性。如果用户单击'Reset‘,我希望发出的值为'None’

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

代码语言:javascript
复制
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_())
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-05 05:12:13

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

代码语言:javascript
复制
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_())
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50688002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档