Как получить подменю в файле Pyqt5 .ui?

#python #python-3.x #user-interface #pyqt5

#python #python-3.x #пользовательский интерфейс #pyqt5

Вопрос:

Я хочу получить подменю, которое является 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), все элементы в инспекторе объектов (древовидное представление, в котором перечислены все виджеты в вашем пользовательском интерфейсе) становятся доступными как атрибуты экземпляра в соответствии с их именем объекта.

Итак, если ваше действие вызывается actionQuit_FromProgram в инспекторе, вы можете получить к нему прямой доступ с помощью self.actionQuit_FromProgram .

Это также означает, что:

  • все это findChild абсолютно бесполезно: у вас уже есть доступ к self.qrgenerator , self.qredit и т. Д;
  • в любом случае, findChild следует использовать с правильным классом объекта, который вы ищете: я искренне сомневаюсь, что это actionQuit_FromProgram QMenuBar (так что использование findChild(QMenuBar, ...) вообще не сработает; если это действие, используйте findChild(QAction, ...) ; если это подменю, используйте findChild(Qmenu, ...) ;
  • обычно для каждого QMainWindow есть только одна строка меню, и она легко доступна с помощью self.menuBar() ;