Включить MenuBar из отдельного файла - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь включить MenuBar из отдельного файла и пытаюсь подключиться с помощью функции

Я включил некоторый код, который вызывает ту же проблему

foo.py

from PyQt5.QtWidgets import *
from PyQt5.uic import loadUiType
import os
import sys
from foomenu import menu

FROM_MAIN, _ = loadUiType(os.path.join(os.path.dirname(__file__), "SalesGui.ui"))


class Main(QMainWindow, FROM_MAIN):
    def __init__(self, parent=None):
        super(Main, self).__init__(parent)

        self.setupUi(self)
        self.MyMenu = menu(self)
        self.MyMenu.NewProduct.triggered.connect(self.NewProduct())

    def NewProduct(self):
        print("foo")


def main():
    app = QApplication(sys.argv)
    window = Main()
    window.show()
    app.exec_()


if __name__ == '__main__':
    try:
        main()
    except Exception as why:
        print(why)

и foomenu.py

from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QAction, QMenu


def menu(self):
    mainMenu = self.menuBar()
    fileMenu = mainMenu.addMenu('FooMenu')

    NewProduct = QAction(QIcon('icons/exit.png'), 'Foo', self)
    NewProduct.setShortcut('Ctrl+Q')
    NewProduct.setStatusTip('FooAction')
    fileMenu.addAction(NewProduct)

При попытке соединить кнопку «Новый продукт» с функцией «Новый продукт» я получаю следующую ошибку

'NoneType' object has no attribute 'NewProduct'

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

Гораздо элегантнее создать подкласс и настроить меню в этом другом файле Python, а затем импортировать и создать экземпляр этого класса в своем файле, который содержит класс Main.

В классе MyMenu вы можете связать сигнал aлокально сокет, который может предоставить отсюда объект отправителя для родительского класса.

Кстати, вы можете перебирать объект действия меню / меню, но гораздо сложнее поддерживать и контролировать, чем явное описание того, кудаподключите потенциально различные действия.

Menu.py:


    class MyMenu(QMenuBar):

        new_product_clicked = Signal(object)

        def __init__(self, parent=None):
            super(MyMenu, self).__init__(parent)

            file_menu = QMenu("File menu", self)
            new_product_action = QAction('Foo', self)
            new_product_action.setShortcut('Ctrl+Q')
            new_product_action.setStatusTip('FooAction')
            new_product_action.triggered.connect(self.new_product_clicked)
            file_menu.addAction(new_product_action)

            self.addMenu(file_menu)

        def new_product_clicked(self):
            """ Call a method from the parent class. """
            self.new_product_clicked.emit(self.sender())

Main.py:

from Menu import MyMenu


class Main(QMainWindow):

    def __init__(self, parent=None):
        super(Main, self).__init__(parent)

        my_menu = MyMenu(self)
        self.setMenuBar(my_menu)
        self.my_menu.new_product_clicked.connect(self.product_clicked)

    def product_clicked(self, action):
        """ Socket for the clicked action """
        clicked_action = action
        print clicked_action.text()



if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Main()
    window.show()
    app.exec_()
0 голосов
/ 01 октября 2019

Попробуйте:

import os
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QAction, QMenu

#from PyQt5.uic import loadUiType
#from foomenu import menu
#FROM_MAIN, _ = loadUiType(os.path.join(os.path.dirname(__file__), "SalesGui.ui"))

def menu(self):
    mainMenu = self.menuBar()
    fileMenu = mainMenu.addMenu('FooMenu')

    self.NewProduct = QAction(QIcon('exit.png'), 'Foo', self)  # 'icons/exit.png'  # + self
    self.NewProduct.setShortcut('Ctrl+Q')
    self.NewProduct.setStatusTip('FooAction')
    fileMenu.addAction(self.NewProduct)

    return self.NewProduct                                                         # +++

class Main(QMainWindow):#, FROM_MAIN):
    def __init__(self, parent=None):
        super(Main, self).__init__(parent)
#        self.setupUi(self)

        self.MyMenu = menu(self)

#        self.MyMenu.NewProduct.triggered.connect(self.funcNewProduct)             # - ()
        self.MyMenu.triggered.connect(self.funcNewProduct)                         # +

    def funcNewProduct(self):
        print("foo")
        qApp.quit()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Main()
    window.show()
    app.exec_()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...