1
我正在嘗試創建一個簡單的彈出式窗口,其中有一個彈出式菜單,該窗口由頂部按鈕和窗口其餘部分中的列表激活。我想出了以下簡化代碼:彈出窗口中的菜單被中央部件取消激活
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_())
但問題是,菜單項不是在所有如果點擊該窗口中的菜單的一部分進行激活。在窗口外面它正常工作。在使用Python 3.5.2的Windows 7和通過Miniconda安裝的PyQt 5.6.0上存在此問題。但是,代碼在Debian GNU/Linux 8(穩定版)上使用Python 3.4.2和PyQt 5.3.2從股票庫中按預期工作。無論哪個小部件設置爲中央,都無關緊要。
以這種方式安排小部件是否是一種好習慣?可以做些什麼來解決這個問題?