framelesswindowhint导致qmenu无法正常工作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了framelesswindowhint导致qmenu无法正常工作相关的知识,希望对你有一定的参考价值。

我是pyqt的新手。我想摆脱qmenu阴影。但是当我添加framelesswindowhint时,菜单无法正常工作。

实现framelesswindowhint之前的代码:

import sys
from PyQt5 import QtWidgets, QtCore, QtGui


class MainWindow(QtWidgets.QWidget):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setMinimumSize(800, 400)
        self.setStyleSheet(
            """
        background-color:white;
        """
        )
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        self.mainlayout = QtWidgets.QVBoxLayout()

        button = QtWidgets.QPushButton("my button")
        filemenu = QtWidgets.QMenu(button)
        #filemenu.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        filemenu.setObjectName("filemenu")
        openaction = QtWidgets.QAction("open item", self)
        filemenu.addAction(openaction)
        button.setMenu(filemenu)
        self.mainlayout.addWidget(button)
        self.setLayout(self.mainlayout)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    # app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
    mw = MainWindow()
    # mw.setWindowOpacity(0.95)
    mw.show()
    sys.exit(app.exec_())

输出:(点击按钮):enter image description here

取消注释后:(按钮未点击)enter image description here

(点击按钮)enter image description here

答案

Qt.NoDropShadowWindowHint禁用支持平台上的窗口投影。

import sys
from PyQt5 import QtWidgets, QtCore, QtGui


class MainWindow(QtWidgets.QWidget):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)

        self.label = QtWidgets.QLabel(self, alignment=QtCore.Qt.AlignCenter)
        button = QtWidgets.QPushButton("my button")

        filemenu = QtWidgets.QMenu(button)
        filemenu.triggered.connect(self.selected)

        #filemenu.setWindowFlags(QtCore.Qt.FramelessWindowHint)         #  ---                  
        filemenu.setWindowFlags(filemenu.windowFlags()                  #  +++
                                | QtCore.Qt.NoDropShadowWindowHint)     #  +++

        openaction = QtWidgets.QAction("open item", self)
        filemenu.addAction(openaction)
        filemenu.addAction("Do something...") 

        button.setMenu(filemenu)

        self.mainlayout = QtWidgets.QVBoxLayout()
        self.mainlayout.addStretch()
        self.mainlayout.addWidget(self.label)
        self.mainlayout.addWidget(button)
        self.mainlayout.addStretch()
        self.setLayout(self.mainlayout)

    def selected(self, q):
        self.label.setText(q.text() + ' selected')


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

QMenu {
    background-color: #ABABAB; /* sets background of the menu */
    border: 1px solid black;  
    margin: 0;   
}

QMenu::item {
    background-color: red; 
}

QMenu::item:selected { 
    background-color: #654321;
}

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

QLabel { 
color: red;
font: 27px;
} 

QPushButton {
    background-color: yellow;  
}
""" 

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    # app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
    app.setStyleSheet(CSS)
    mw = MainWindow()
    # mw.setWindowOpacity(0.95)
    mw.setMinimumSize(800, 400)
    mw.show()
    sys.exit(app.exec_())

enter image description here

以上是关于framelesswindowhint导致qmenu无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

目标 C:序列化/归档问题

如何为排毒 e2e 测试提供自定义测试文件路径

如何将 iOS 应用 IPA 交付给客户以使用他们自己的企业配置文件进行签名

amazon redshift 并发写入导致插入记录,导致重复

FileHandler 创建会导致 NoSuchFileException 导致缺少 .lck

导致非标准行为的 #pragma 是不是会导致 __STDC__ 宏未定义为 1?