framelesswindowhint导致qmenu无法正常工作

时间:2019-02-17 15:39:46

标签: python qt user-interface pyqt

我是pyqt的新手。我想摆脱qmenu阴影。但是,当我添加无框架窗口提示时,菜单无法正常工作。

实现无框架窗口提示之前的代码:

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

1 个答案:

答案 0 :(得分:0)

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