Python 包含单独文件中的菜单栏
我正在尝试从单独的文件中包含菜单栏,并尝试连接函数 我包括一些代码,我有同样的问题 福比Python 包含单独文件中的菜单栏,python,python-3.x,pyqt,Python,Python 3.x,Pyqt,我正在尝试从单独的文件中包含菜单栏,并尝试连接函数 我包括一些代码,我有同样的问题 福比 从PyQt5.QtWidgets导入* 从PyQt5.uic导入loadUiType 导入操作系统 导入系统 从菜单导入菜单 在\u MAIN中,\uu=loadUiType(os.path.join(os.path.dirname(\uuu文件);“SalesGui.ui”)) 主类(QMainWindow,从主类): def uuu init uuu(self,parent=None): 超级(主、自)
从PyQt5.QtWidgets导入*
从PyQt5.uic导入loadUiType
导入操作系统
导入系统
从菜单导入菜单
在\u MAIN中,\uu=loadUiType(os.path.join(os.path.dirname(\uuu文件);“SalesGui.ui”))
主类(QMainWindow,从主类):
def uuu init uuu(self,parent=None):
超级(主、自).\uuuu初始化\uuuuuu(父)
self.setupUi(self)
self.MyMenu=菜单(self)
self.MyMenu.NewProduct.triggered.connect(self.NewProduct())
def新产品(自我):
打印(“foo”)
def main():
app=QApplication(sys.argv)
window=Main()
window.show()
app.exec()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
尝试:
main()
例外情况除外,原因如下:
打印(为什么)
和foodmenu.py
从PyQt5.QtGui导入QIcon
从PyQt5.qtwidts导入QAction、QMenu
def菜单(自我):
mainMenu=self.menuBar()
fileMenu=mainMenu.addMenu('FooMenu'))
NewProduct=QAction(QIcon('icons/exit.png'),'Foo',self)
NewProduct.setShortcut('Ctrl+Q')
NewProduct.setStatusIP('FooAction'))
fileMenu.addAction(新产品)
当尝试将“NewProduct”按钮与“New Product”功能连接时,我得到以下错误
'NoneType'对象没有属性“NewProduct”
试试看:
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_()
在另一个python文件中对菜单栏进行子类化和设置,然后在保存主类的文件中导入并实例化该类,这要优雅得多 在MyMenu类中,您可以将信号绑定到本地套接字,从这里可以为父类提供sender对象 顺便说一句,您可以迭代菜单栏/菜单的action对象,但维护和控制要比显式描述连接潜在不同操作的位置困难得多 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_()
您的信号/插槽设置不正确-事实上,除了您调用它们之外,它们既不是信号也不是插槽-只是一个直接的函数调用-检查一下,即使您的实际信号也没有插槽,虽然可以这样做-但是显式编码比惰性编码好;)是的,对,再发射一个信号会更好。我改了。