如何在 Pyqt5 .ui 文件中获取子菜单?

Posted

技术标签:

【中文标题】如何在 Pyqt5 .ui 文件中获取子菜单?【英文标题】:How to get submenu In Pyqt5 .ui file? 【发布时间】:2020-08-24 10:39:11 【问题描述】:

我想要获得 QuitProgram 的子菜单

如何在变量中设置它的动作以退出程序?

文件菜单对象名称是 'actionQuit_FromProgram'

Python 文件:

from PyQt5 import QtWidgets, uic
from PyQt5.QtWidgets import QFileDialog, QMenuBar
from PyQt5.QtGui import *
import sys
import os
import qdarkgraystyle
path = os.path.abspath(os.getcwd())
import qrcode

class Ui(QtWidgets.QMainWindow):
def __init__(self):
    super(Ui, self).__init__()
    uic.loadUi('main.ui', self)
    #self.show()
    self.button = self.findChild(QtWidgets.QPushButton, 'qrgenerator')
    self.button.clicked.connect(self.QrCodeGenerator) # Remember to pass the definition/method, not the return value!
    self.input = self.findChild(QtWidgets.QLineEdit, 'qredit')
    self.button1 = self.findChild(QtWidgets.QPushButton, 'qropen')
    self.button1.clicked.connect(self.OpenQRCode)
    self.menu1 = self.findChild(QMenuBar,'actionQuit_FromProgram')
    print(self.menu1)
    #self.menu1.triggered.connect(qApp.quit)
    self.show()

def QrCodeGenerator(self):
    # Generate QR code
    self.url = qrcode.make(self.qredit.text())
    if self.qredit.text() == '':
        QMessageBox.warning(self, "Error", "Please Type In Something To Generate Qr Code")
    else:
        self.url.save("filename.png","PNG")
def OpenQRCode(self):
    fname = QFileDialog.getOpenFileName(self, 'Open file', 
    path,"Image files (*.jpg *.gif *.png *.svg)")[0]
    self.label_2.setPixmap(QPixmap(fname))

app = QtWidgets.QApplication(sys.argv)
app.setStyleSheet(qdarkgraystyle.load_stylesheet())
window = Ui()
app.exec_()

【问题讨论】:

【参考方案1】:

如果您使用loadUi(或setupUi,如果您使用由 pyuic 生成的文件),则对象检查器(列出 UI 上所有小部件的树视图)中的所有元素都可用作实例属性,根据他们的object name。

因此,如果您的操作在检查器中被称为actionQuit_FromProgram,您可以使用self.actionQuit_FromProgram 直接访问它。

这也意味着:

所有findChild 绝对没用:您已经可以访问self.qrgeneratorself.qredit 等; 无论如何,findChild 应该与您正在寻找的对象的正确类一起使用:我真诚地怀疑actionQuit_FromProgram 是一个 QMenuBar(所以,使用findChild(QMenuBar, ...) 根本不起作用;如果是动作,使用findChild(QAction, ...);如果是子菜单,使用findChild(Qmenu, ...); 每个QMainWindow通常只有一个菜单栏,使用self.menuBar()很容易访问;

【讨论】:

以上是关于如何在 Pyqt5 .ui 文件中获取子菜单?的主要内容,如果未能解决你的问题,请参考以下文章

具有多个意图的 PyQt5(同一窗口中的页面)

如何将 .qml 扩展名更改为 .ui 以在 pyqt5 应用程序中使用它

如何将变量从 PyQt5 UI 返回到 Main 函数 - Python

如何在pyqt5 ui小部件代码中使用python脚本

如何使用 org.eclipse.ui.menus 向 Eclipse Package Explorer 上下文菜单项添加子菜单条目?

如何使用 PyQt5 和 python 3.6 将 .ui 文件转换为 .py 文件