无法使 Qmenu 背景弯曲

Posted

技术标签:

【中文标题】无法使 Qmenu 背景弯曲【英文标题】:Cannot make Qmenu background curved 【发布时间】:2019-02-18 17:25:09 【问题描述】:

我是 pyqt 的新手。

我想要一个带有弯曲背景的菜单。但无法去除黑边。

看起来边框是弯曲的。但我无法删除方形背景。

import sys
from PyQt5 import QtCore, QtWidgets, QtGui


class main(QtWidgets.QDialog):
    def __init__(self):
        super(main, self).__init__()
        layout = QtWidgets.QVBoxLayout()
        button = QtWidgets.QPushButton("menu", self)
        menu = QtWidgets.QMenu(button)

        menu.setWindowFlags(
            menu.windowFlags() | QtCore.Qt.FramelessWindowHint
        )
        menu.setWindowFlags(
            menu.windowFlags() | QtCore.Qt.NoDropShadowWindowHint
        )


        firstaction = QtWidgets.QAction("1st Item", self)
        secondaction = QtWidgets.QAction("2nd Item", self)
        thirdaction = QtWidgets.QAction("3rd Item", self)
        fourthaction = QtWidgets.QAction("4th Item", self)

        menu.addAction(firstaction)
        menu.addAction(secondaction)
        menu.addAction(thirdaction)
        menu.addAction(fourthaction)

        button.setMenu(menu)
        menu.setStyleSheet("""
        background-color:black;
        border-radius:20;
        border:1px solid white;"""
                           )

        self.setMinimumSize(500, 500)

        layout.addWidget(button)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    mw = main()
    mw.show()
    sys.exit(app.exec())

这给出了以下窗口: my menu widget

【问题讨论】:

【参考方案1】:

根据需要自定义样式表 (CSS)。

import sys
from PyQt5 import QtCore, QtWidgets, QtGui


class main(QtWidgets.QDialog):
    def __init__(self):
        super(main, self).__init__()
        layout = QtWidgets.QVBoxLayout()
        button = QtWidgets.QPushButton("menu", self)
        menu = QtWidgets.QMenu(button)
        menu.setWindowFlags(
            menu.windowFlags() | QtCore.Qt.FramelessWindowHint
        )
        menu.setWindowFlags(
            menu.windowFlags() | QtCore.Qt.NoDropShadowWindowHint
        )
        menu.setFont(QtGui.QFont("Arial", 10, QtGui.QFont.Bold))   # +++

        firstaction  = QtWidgets.QAction(" 1st Item", self)
        secondaction = QtWidgets.QAction(" 2nd Item", self)
        thirdaction  = QtWidgets.QAction(" 3rd Item", self)
        fourthaction = QtWidgets.QAction(" 4th Item", self)

        menu.addAction(firstaction)
        menu.addAction(secondaction)
        menu.addAction(thirdaction)
        menu.addAction(fourthaction)

        button.setMenu(menu)
#        menu.setStyleSheet("""
#        background-color:black;
#        border-radius:20;
#        border:1px solid white;"""
#                           )
        self.setMinimumSize(500, 500)
        layout.addWidget(button)


CSS = """
QWidget 
    background-color: white;  

QMenu 
    background-color: #ABABAB; 
    border: 2px solid red;          /* black */
    margin: 0;   
    padding: 5px;
    border-radius: 20px;
    background: white;       

QMenu::item 
    background-color: black; 
    color: white; 
    height: 20px;
    width: 60px;
    margin: 1px 0px 1px 0px;
    border: 1px transparent #2A2929;  
    border-radius: 7px;    

QMenu::item:selected  
    background-color: green;  /* #654321; */

QMenu::separator 
    height: 12px;
    background: lightblue;
    margin-left: 10px;
    margin-right: 5px;

QPushButton 
    background-color: yellow;  

""" 

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    app.setStyleSheet(CSS)                    # +++
    mw = main()
    mw.show()
    sys.exit(app.exec())

【讨论】:

以上是关于无法使 Qmenu 背景弯曲的主要内容,如果未能解决你的问题,请参考以下文章

将背景图像应用到 Qmenu

子 QMenu 中的 QPushButton,悬停时更改背景

如何分割弯曲杆以进行角度计算?

用于 Pre-Lollipop 设备的具有弯曲背景的 Android Ripple 按钮

QMenu 未通过 addMenu 创建时不继承样式表

如何使qmenu项目可检查pyqt4 python