为什么QMenu快捷键没有从模态QDialog触发?

问题描述 投票:0回答:1

对于这个问题,我有两个窗口:一个带有 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

python pyqt5 shortcut
1个回答
0
投票

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)

如果还有其他答案请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.