弹出窗口中的菜单会被中央窗口小部件取消激活

时间:2017-01-18 15:17:45

标签: python windows pyqt pyqt5

我正在尝试创建一个简单的弹出窗口,其中弹出菜单由顶部的按钮激活,窗口的其余部分列表。我提出了以下简化代码:

from PyQt5 import QtWidgets, QtCore, QtGui
import sys

class MenuWidget(QtWidgets.QWidget):
    def __init__(self, flags=QtCore.Qt.Widget, parent=None):
        super().__init__(parent, flags=flags)

        self.popup_menu = QtWidgets.QMenu(self)

        self.action1 = QtWidgets.QAction('Action1', self)
        self.action1.triggered.connect(self.do_action1)
        self.action2 = QtWidgets.QAction('Action2', self)
        self.action2.triggered.connect(self.do_action2)

        self.popup_menu.addAction(self.action1)
        self.popup_menu.addAction(self.action2)
        self.menu_button = QtWidgets.QToolButton(self)
        self.menu_button.setMenu(self.popup_menu)
        self.menu_button.setPopupMode(QtWidgets.QToolButton.InstantPopup)

        self.label = QtWidgets.QLabel('test')
        self.layout = QtWidgets.QHBoxLayout()
        self.layout.addWidget(self.label, 1)
        self.layout.addWidget(self.menu_button)
        self.setLayout(self.layout)

    def do_action1(self):
        print('Doing action1')

    def do_action2(self):
        print('Doing action2')


class MenuTesting(QtWidgets.QMainWindow):
    def __init__(self, flags=QtCore.Qt.Window, parent=None):
        super().__init__(parent, flags=flags)
        self.setWindowFlags(QtCore.Qt.Popup)

        self.tester = MenuWidget(parent=self)
        self.setMenuWidget(self.tester)

        self.somelist = QtWidgets.QListWidget(parent=self)
        self.setCentralWidget(self.somelist)

        self.show()


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    ex = MenuTesting()
    sys.exit(app.exec_())

但问题是,如果在窗口内部的菜单部分进行了单击,则根本不会激活菜单项。在窗外,它可以正常工作。 Windows 7上存在此问题,通过Miniconda安装了Python 3.5.2和PyQt 5.6.0。但是,代码在Debian GNU / Linux 8(稳定版)上使用Python 3.4.2和PyQt 5.3.2从库存库中按预期工作。将哪个窗口小部件设置为中心无关紧要。

以这种方式安排小部件是一种好习惯吗?如何解决问题呢?

1 个答案:

答案 0 :(得分:0)

看起来这是pyqt 5.6.0-py35_0中的一个错误,对py35_1的更新有帮助。