【问题标题】:QMenu not inheriting stylesheet when not created via addMenuQMenu 未通过 addMenu 创建时不继承样式表
【发布时间】:2020-07-23 00:34:57
【问题描述】:

我在整个窗口中设置了一个样式表,其中QMenu 的背景应该是绿色的。但是,当我创建菜单(MenuBar 类中的self.project_menu)时,它不会继承样式表。如果我改为使用 self.project_menu = self.addMenu("Project") 它工作正常。这样做有什么原因吗?

class MenuBar(QtWidgets.QMenuBar):
    def __init__(self):
        super(MenuBar, self).__init__()
        self.project_menu = QtWidgets.QMenu("Project")
        self.addMenu(self.project_menu)
        self.create_new_action = self.project_menu.addAction("Create New Project")


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.widget = QtWidgets.QWidget()
        self.setCentralWidget(self.widget)
        self.mainLayout = QtWidgets.QVBoxLayout()
        self.widget.setLayout(self.mainLayout)

        self.menu_bar = MenuBar()
        self.setMenuBar(self.menu_bar)


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    win = MainWindow()
    win.setStyleSheet("""
        QMenu{
            background: green;
        }
    """)
    win.show()
    sys.exit(app.exec_())

【问题讨论】:

    标签: python pyqt pyside2 qtstylesheets qmenu


    【解决方案1】:

    说明:

    当使用setStyleSheet方法从父母传播到孩子时,在使用的情况下:

    self.project_menu = self.addMenu("Project")
    

    QMenu 的父级是 QMenuBar(您可以检查:assert self.project_menu.parent() == self),QMenuBar 是窗口的子级,因此样式表将被传播。

    如果你使用:

    self.project_menu = QtWidgets.QMenu("Project")
    self.addMenu(self.project_menu)
    

    QMenu 没有父级,因此不会传播样式表。

    解决方案:

    解决方法是将QMenuBar设置为QMenu的父级:

    self.project_menu = QtWidgets.QMenu("Project", self)
    self.addMenu(self.project_menu)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 2018-01-24
      • 1970-01-01
      • 2017-05-20
      • 1970-01-01
      • 2019-09-18
      • 2018-05-10
      相关资源
      最近更新 更多