对于这个问题,我有两个窗口:一个带有 QMenu 和一个 QPushButton 的 QMainWindow,以及一个仅带有 QLabel 的 QDialog 窗口。
当用户点击 QMenu 操作时,屏幕上会出现一条控制台消息。 此操作有快捷键(F10)。
当用户单击按钮时,会出现一个模态 QDialog。我使用
show()
方法而不是 exec()
或 exec_()
来不停止主窗口功能。问题是,从 QDialog 我无法触发 QMainWindow 中 QMenu 的操作。
如果我重新定义触发器,那么我应该使用快捷方式,但是如何在代码没有太多更改的情况下解决它?
文件:untitled.py
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '.\untitled.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(363, 62)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setObjectName("pushButton")
self.gridLayout.addWidget(self.pushButton, 0, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 363, 21))
self.menubar.setObjectName("menubar")
self.menuMenu = QtWidgets.QMenu(self.menubar)
self.menuMenu.setObjectName("menuMenu")
MainWindow.setMenuBar(self.menubar)
self.actionMenu_action_1 = QtWidgets.QAction(MainWindow)
self.actionMenu_action_1.setObjectName("actionMenu_action_1")
self.menuMenu.addAction(self.actionMenu_action_1)
self.menubar.addAction(self.menuMenu.menuAction())
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "Click to open modal Dialog"))
self.menuMenu.setTitle(_translate("MainWindow", "Menu"))
self.actionMenu_action_1.setText(_translate("MainWindow", "Menu action 1 (print in console)"))
self.actionMenu_action_1.setShortcut(_translate("MainWindow", "F10"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
文件:untitled_2.py
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '.\untitled_2.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(228, 80)
self.gridLayout = QtWidgets.QGridLayout(Dialog)
self.gridLayout.setObjectName("gridLayout")
self.label = QtWidgets.QLabel(Dialog)
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.label.setText(_translate("Dialog", "Press F10 to test shortcut"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Dialog = QtWidgets.QDialog()
ui = Ui_Dialog()
ui.setupUi(Dialog)
Dialog.show()
sys.exit(app.exec_())
文件run_app.py
from PyQt5 import QtCore, QtGui, QtWidgets
from untitled import Ui_MainWindow
from untitled_2 import Ui_Dialog
import sys
import os
class Run_me:
def __init__(self):
self.app = QtWidgets.QApplication(sys.argv)
self.MainWindow = QtWidgets.QMainWindow()
self.ui = Ui_MainWindow()
self.ui.setupUi(self.MainWindow)
self.MainWindow.show()
self.ui.pushButton.clicked.connect(lambda state:self.open_q_dialog(state))
self.ui.actionMenu_action_1.triggered.connect(lambda:print("Action triggered"))
sys.exit(self.app.exec_())
def open_q_dialog(self,state):
self.Dialog = CustomQDialog()
self.dialog_ui = Ui_Dialog()
self.dialog_ui.setupUi(self.Dialog)
self.Dialog.show()
class CustomQDialog(QtWidgets.QDialog):
def __init__(self,*args,**kwards):
super().__init__(*args,**kwards)
self.setModal(True)
#self.setModal(False)
if __name__ == "__main__":
program = Run_me()
可能由于 QMainWindow 未聚焦而未触发该操作。但它永远不会聚焦,因为
self.setModal(True)
中的Custom_QDialog
。
run_app.py
中的修改:
class CustomQDialog(QtWidgets.QDialog):
def __init__(self,parent_self,*args,**kwards):
super().__init__(*args,**kwards)
self.setModal(True)
self.addAction(parent_self.ui.actionMenu_action_1)
致电:
self.Dialog = CustomQDialog(self)
如果还有其他答案请告诉我。