而不是这个:
filemenu=menubar.addmenu('&file')
文件菜单.addaction(colaction)
self.ui_color_filter=colorblock()。
self.ui_color_filter.setmenu(文件菜单)
下面是完整的工作示例。只需取消对代码的注释就可以创建我要解决的问题。您会注意到,当单击UI主要部分中的黑色大矩形时,菜单将不再出现。
导入系统
从Pyside导入qtgui,qtcore
类色块(qtgui.qpushButton):
colorclicked=qtcore.signal(qtgui.qcolor)
定义初始化(self,*args,**kwargs):
super(色块,自身)。初始化(*args,**kwargs)
self.setautofillbackground(真)
self.pressed.connect(单击self.color)
def paintevent(自我,事件):
painter=qtgui.qpainter(自我)
paint.fillRect(0,0,self.width(),self.height(),qtgui.qcolor(0,0,0,255))。
paint.end()。
已单击“定义颜色”(自身):
self.colorclicked.emit(qtgui.qcolor())
类色块(qtgui.qwidget):
colorSelected=qtcore.signal(qtgui.qcolor)
定义初始化(self,parent=none):
super(色块,自身)。初始化(父级)
lay_main=qtgui.qgridlayout(self)
铺设主调整间距(5)
放置主.setContentsMargins(5,5,5,5)
行=0
列=0
对于范围(10)内的i:
ui_swatch=colorblock()。
lay_main.addwidget(ui_样本、行、列)
ui_swatch.colorclicked.connect(self.colorselected)
列+=1
如果列==5:
行+=1
列=0
类示例(qtgui.qmainwindow):
定义初始化(self):
super(例如,self)。初始化
ql=色块()
colaction=qtgui.qwidgetaction(自我)
colaction.setdefaultwidget(ql)
ql.colorselected.connect(自己单击的颜色)
menubar=self.menubar()。
filemenu=menubar.addmenu('&file')
文件菜单.addaction(colaction)
self.ui_color_filter=colorblock()。
self.ui_color_filter.setmenu(文件菜单)
#menu撊colors=qtgui.qmenu('colors')
#菜单颜色。添加操作(colaction)
#self.ui_color_filter.setmenu(菜单_colors)
lay_main=qtgui.qvboxlayout()。
放置主集合对齐(qtcore.qt.AlignTop)
lay_main.addwidget(self.ui_color_filter)
widget_main=qtgui.qwidget()。
小部件主设置布局(主布局)
self.setcentralwidget(小部件主)
自设置几何图形(300、300、250、150)
self.setWindowTitle('menubar')
self.show()。
def单击了“颜色”(自身,颜色):
print('单击了',color.isvalid(),color)
self.ui_color_filter.color=颜色
self.sender().parent().hide()。
app=qtgui.qapplication(系统argv)
ex=示例()
系统退出(app.exec_u())
但是,由于某种原因,当我使用这段代码时,菜单不会显示:
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_())