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

QwidgetAction未显示菜单

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

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

    但是由于某种原因,当我使用这段代码时,菜单不会显示:

    menu_colors=qtgui.qmenu('colors')
    菜单颜色。添加操作(colaction)
    self.ui_color_filter.setmenu(菜单_colors)
    

    而不是这个:

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

    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 回复  |  直到 6 年前
        1
  •  1
  •   eyllanesc RAHUL KUMAR    6 年前

    你不能分享 QAction 在几个 QMenu ,因此必须为 Q菜单 QMenuBar 主窗口小部件和另一个用于 self.ui_color_filter . 另一方面,菜单颜色必须传递一个父级,因为如果不删除。

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