Python PyQt5 QTableWidget contextMenuEvent setStyleSheet 子菜单背景色

Posted

技术标签:

【中文标题】Python PyQt5 QTableWidget contextMenuEvent setStyleSheet 子菜单背景色【英文标题】:Python PyQt5 QTableWidget contextMenuEvent setStyleSheet submenu background colour 【发布时间】:2020-03-12 08:18:43 【问题描述】:

我的 PyQt5 QTableWidget 中有一个上下文菜单。

def contextMenuEvent(self, event):
    """Open context menu for selected items."""

    selected_items = self.selectedItems()
    if selected_items:

        menu = QMenu(self)
        menu.setStyleSheet("""
            QMenu border: 1px inset grey; background-color: #fff; color: #000; padding: 0;
            QMenu:selected background-color: #ddf; color: #000;"""
        )
        # File submenu
        file_menu = QMenu("File")
        delete_action = file_menu.addAction("Delete")
        menu.addMenu(file_menu)

        # Format sub_menu
        format_menu = QMenu("Format")
        format_split_action = format_menu.addAction("Split address")
        format_title_case_action = format_menu.addAction("Title Case")
        menu.addMenu(format_menu)

        menu.addSeparator()

        # Quick links
        menu.addAction("Split address")
        menu.addAction("Title Case")

        action = menu.exec_(self.mapToGlobal(event.pos()))
        if action:
            if action == format_title_case_action:
                self.format_title_case()
            elif action == format_split_action:
                self.split_address()
            elif action == delete_action:
                self.remove_selected_rows()

样式表几乎按照我想要的方式格式化菜单,但它不会改变子菜单(文件和格式)的背景颜色,它仍然有灰色背景:

我认为我需要在样式表中为子菜单样式添加另一个条目。有谁知道我需要补充什么?

【问题讨论】:

【参考方案1】:

样式表仅由应用它们的小部件的子级继承。 如果您将一个菜单添加到另一个菜单,它不会成为它的子菜单,这是因为同一个菜单可以在多种情况下使用(来自QMenu.addMenu(QMenu)):

此菜单不拥有菜单的所有权。

解决方案是将该主菜单设置为您希望为其应用样式表的每个子菜单的父菜单:

    menu = QMenu(self)
    menu.setStyleSheet("""
        QMenu border: 1px inset grey; background-color: #fff; color: #000; padding: 0;
        QMenu:selected background-color: #ddf; color: #000;
    """)
    file_menu = QMenu("File", menu)

或者,您可以对 QMenu.addMenu() 执行相同操作:

    file_menu = menu.addMenu("File")

这不是您的情况,但值得注意的是,如果您在其他地方使用该子菜单,主菜单仍将是其父菜单,因此将具有相同的样式表。

【讨论】:

完美,谢谢 :-) 我刚刚在每个子菜单中添加了“, menu”。例如。 file_menu = QMenu("文件", 菜单)

以上是关于Python PyQt5 QTableWidget contextMenuEvent setStyleSheet 子菜单背景色的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PyQt5 Python 将 QTableWidget 数据转换为 PDF

Python PyQt5 qtableWidget 到 excel 错误

Python PyQt5 QTableWidget contextMenuEvent setStyleSheet 子菜单背景色

PyQt5如何使用python在迭代循环中更新单元格值Qtablewidget

Pyqt5 qtablewidget 检测单元格何时更改

QTablewidget 在 PyQt5 中不显示新的 cellWidgets