QWidgetAction не показывает меню - PullRequest
0 голосов
/ 02 июля 2018

Я создал собственный виджет, который используется в QMenu. В каком меню отображается пользователь нажимает на прямоугольник блока, как показано на рисунке ниже. Однако, когда я изменяю способ, которым меню назначается элементу управления, оно почему-то перестает работать.

enter image description here

Однако по какой-то причине меню не отображается, когда я использую этот фрагмент кода:

menu_colors = QtGui.QMenu('Colors')
menu_colors.addAction(colAction)
self.ui_color_filter.setMenu(menu_colors)

вместо этого:

fileMenu = menubar.addMenu('&File')
fileMenu.addAction(colAction)
self.ui_color_filter = ColorBlock()
self.ui_color_filter.setMenu(fileMenu)

Ниже приведен полный рабочий пример. Просто откомментируйте код, чтобы создать проблему, которую я пытаюсь решить. Вы заметите, что меню больше не будет появляться при нажатии на большой черный прямоугольник в основной части интерфейса.

import sys
from PySide import QtGui, QtCore


class ColorBlock(QtGui.QPushButton):

    colorClicked = QtCore.Signal(QtGui.QColor)

    def __init__(self, *args, **kwargs):
        super(ColorBlock, self).__init__(*args, **kwargs)
        self.setAutoFillBackground(True)
        self.pressed.connect(self.color_clicked)

    def paintEvent(self, event):
        painter = QtGui.QPainter(self)
        painter.fillRect(0, 0, self.width(), self.height(), QtGui.QColor(0, 0, 0, 255))
        painter.end()

    def color_clicked(self):
        self.colorClicked.emit(QtGui.QColor())


class ColorBlocks(QtGui.QWidget):

    colorSelected = QtCore.Signal(QtGui.QColor) 

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

        row = 0
        column = 0
        for i in range(10):
            ui_swatch = ColorBlock()
            lay_main.addWidget(ui_swatch, row, column)
            ui_swatch.colorClicked.connect(self.colorSelected)

            column += 1
            if column == 5: 
                row += 1
                column = 0


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

        ql = ColorBlocks()

        colAction = QtGui.QWidgetAction(self)
        colAction.setDefaultWidget(ql)
        ql.colorSelected.connect(self.clicked_color)
        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(colAction)


        self.ui_color_filter = ColorBlock()
        self.ui_color_filter.setMenu(fileMenu)

        # menu_colors = QtGui.QMenu('Colors')
        # menu_colors.addAction(colAction)
        # self.ui_color_filter.setMenu(menu_colors)

        lay_main = QtGui.QVBoxLayout()
        lay_main.setAlignment(QtCore.Qt.AlignTop)
        lay_main.addWidget(self.ui_color_filter)
        widget_main = QtGui.QWidget()
        widget_main.setLayout(lay_main)
        self.setCentralWidget(widget_main)

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

    def clicked_color(self, color):
        print('Clicked:', color.isValid(), color)
        self.ui_color_filter.color = color
        self.sender().parent().hide()


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

1 Ответ

0 голосов
/ 02 июля 2018

Вы не можете использовать один и тот же QAction в нескольких QMenu, поэтому вы должны создать один для QMenu QMenuBar основного виджета и другой для меню self.ui_color_filter. С другой стороны, menu_colors вы должны передать родительский элемент, потому что если он не удален.

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

        ql = ColorBlocks()

        colAction = QtGui.QWidgetAction(self)
        colAction.setDefaultWidget(ql)
        ql.colorSelected.connect(self.clicked_color)
        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(colAction)

        self.ui_color_filter = ColorBlock()
        ql1 = ColorBlocks()
        colAction1 = QtGui.QWidgetAction(self)
        colAction1.setDefaultWidget(ql1)
        ql1.colorSelected.connect(self.clicked_color)
        menu_colors = QtGui.QMenu('Colors', self)
        menu_colors.addAction(colAction1)
        self.ui_color_filter.setMenu(menu_colors)

        lay_main = QtGui.QVBoxLayout()
        lay_main.setAlignment(QtCore.Qt.AlignTop)
        lay_main.addWidget(self.ui_color_filter)
        widget_main = QtGui.QWidget()
        widget_main.setLayout(lay_main)
        self.setCentralWidget(widget_main)

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