我是 QT Designer 和 PyQt 的新手,但我似乎正在尝试做一些太简单而无法提及或太罕见的事情!
我使用 QT Designer 创建了一个简单的窗口。在该窗口中有两个菜单选项;一个应该关闭窗口,另一个应该打开另一个窗口。
我使用 pyuic5 命令将 ui 转换为 python 文件。
这是我得到的代码:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'Win1.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(441, 305)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 441, 22))
self.menubar.setObjectName("menubar")
self.menuClosing = QtWidgets.QMenu(self.menubar)
self.menuClosing.setObjectName("menuClosing")
self.menuOpen_Win_2 = QtWidgets.QMenu(self.menubar)
self.menuOpen_Win_2.setObjectName("menuOpen_Win_2")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.menubar.addAction(self.menuClosing.menuAction())
self.menubar.addAction(self.menuOpen_Win_2.menuAction())
self.retranslateUi(MainWindow)
self.menuClosing.triggered['QAction*'].connect(MainWindow.close) # type: ignore
self.menuOpen_Win_2.triggered['QAction*'].connect(MainWindow.open) # type: ignore
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.menuClosing.setTitle(_translate("MainWindow", "Closing"))
self.menuOpen_Win_2.setTitle(_translate("MainWindow", "Open Win #2"))
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_())
QT Designer 中的新增功能我已将“close()”插槽分配给 Closing,并创建了一个新插槽“open()”,并将其链接到 Open Win #2。
显然,两者都不起作用。
似乎与将函数分配给子菜单时的逻辑不同(其中将 close() 链接到它确实有效)。
有谁知道我应该怎么做?
Designer 不允许向 QMenuBar 添加基本操作。
事实上,“编辑信号/时隙”模式和“信号/时隙编辑器”都只允许与小部件交互:QActions 不是小部件。
实现此目的的唯一方法是通过代码,并直接向菜单栏添加realQAction。
从 UI 中删除那些(可能是空的)菜单,使用
pyuic
重建代码,然后执行类似的操作(假设输出文件名为 win1.py
):
from PyQt5 import QtWidgets
from win1 import Ui_MainWindow
from win2 import Ui_MainWindow2
class Window(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super().__init__(parent=parent)
self.setupUi(self)
self.closeAction = QtWidgets.QAction('Closing', self)
self.menuBar().addAction(self.closeAction)
self.openWin2Action = QtWidgets.QAction('Open Win #2', self)
self.menuBar().addAction(self.openWin2Action)
self.closeAction.triggered.connect(self.close)
self.openWin2Action.triggered.connect(self.openWin2)
def openWin2(self):
self.win2 = Window2()
self.win2.show()
class Window2(QtWidgets.QMainWindow, Ui_MainWindow2):
def __init__(self):
super().__init__()
self.setupUi(self)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec())
备注:
pyuic
输出,如果您不知道,如果不是为了调试或学习目的,则必须永远不要直接使用或编辑它;上面的代码使用了多重继承的常见做法,如关于 using Designer; 的官方指南中所述
.ui
文件中没有连接的痕迹,所以这不是
pyuic
故障);
triggered
MainWindow2
,但最好设置顶级窗口的唯一对象名称:from win2 import Ui_MainWindow as Ui_MainWindow2
pyuic
;
在已删除答案的评论中,您提到“这样关闭似乎可以保持内核运行”;您可能正在使用 IDE 或交互式 shell,这可能会忽略默认行为(最后一个窗口关闭后立即退出 QApplication):独立运行脚本通常不会导致这种情况,但您始终可以考虑连接到
Ui_<objectNameOfTopLevelWindow>
信号;
使用 self.ActionName.triggered.connect(self.onFunctionName) 在哪里 ActionName - QtDesigner 中的操作/菜单项 onFunctionName - 函数/方法,处理菜单/收费栏按钮点击事件