我已经创建了一个自定义小部件,它用于QMenu。显示了哪个菜单,用户单击块矩形,如下面的图像所示。但是,当我更改将菜单分配给控件的方式时,由于某种原因,它将停止工作。

但是,由于某种原因,当我使用这段代码时,菜单没有显示:
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)下面是完整的工作示例。请不要评论代码来创建我想要解决的问题。您将注意到,当单击UI主部分中的大黑色矩形时,菜单将不再出现。
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_())发布于 2018-07-02 12:44:58
您不能在多个QAction中共享相同的QMenu,因此必须为主小部件的QMenuBar的QMenu创建一个,为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()https://stackoverflow.com/questions/51136100
复制相似问题