Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyQt5:如何在两个子窗口之间通信?_Python_Pyqt - Fatal编程技术网

Python PyQt5:如何在两个子窗口之间通信?

Python PyQt5:如何在两个子窗口之间通信?,python,pyqt,Python,Pyqt,如何从子窗口2更新子窗口1中的组合框。以下代码应该可以正常工作,但它不会更新组合框,也不会在行中显示任何错误 AddressBook().updatestock(name) 在add函数中。它看起来像是创建了地址簿的实例。如果是这样,我如何更正它 import os import sys from PyQt5.QtCore import * from PyQt5.QtWidgets import * from PyQt5.QtGui import * class menudemo(QMai

如何从子窗口2更新子窗口1中的组合框。以下代码应该可以正常工作,但它不会更新组合框,也不会在行中显示任何错误

 AddressBook().updatestock(name)
在add函数中。它看起来像是创建了地址簿的实例。如果是这样,我如何更正它

import os
import sys 
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class menudemo(QMainWindow):
  def __init__(self, parent=None):
    super(menudemo, self).__init__(parent)

    self.pilot_widget=AddInventory()
    self.drop_widget=AddressBook()

    self.centralWidget=QMdiArea(self)
    self.setCentralWidget(self.centralWidget)

    self.sub1=QMdiSubWindow()
    self.sub1.setWidget(self.drop_widget)
    self.centralWidget.addSubWindow(self.sub1)
    self.sub1.show()

    self.sub2=QMdiSubWindow()
    self.sub2.setWidget(self.pilot_widget)
    self.centralWidget.addSubWindow(self.sub2)
    self.sub2.show()
    self.setWindowTitle("menu demo")
    self.showMaximized()

class AddInventory(QWidget):
 def __init__(self, parent=None):
    super(AddInventory, self).__init__(parent)
    self.statement=""
    self.nameLabel = QLabel("Item:")
    self.name=QLineEdit()
    self.addButton = QPushButton("&Add")
    self.addButton.setDefault(True)
    self.addButton.clicked.connect(self.add)
    mainLayout = QGridLayout()
    mainLayout.addWidget(self.nameLabel, 0, 0)
    mainLayout.addWidget(self.name,0,1)
    mainLayout.addWidget(self.addButton, 0, 3)
    self.setLayout(mainLayout)
    self.setWindowTitle(" Address Book")
    self.setFixedSize(self.sizeHint())
 def add(self,text):
    name=self.name.text()
    AddressBook().updatestock(name)
    self.name.clear()

class AddressBook(QWidget):
 def __init__(self, parent=None):
    super(AddressBook, self).__init__(parent)


    nameLabel2 = QLabel("Item:")
    self.itemstock=QComboBox(self)
    self.itemstock.activated[str].connect(self.updatestock)
    mainLayout = QGridLayout()
    mainLayout.addWidget(nameLabel2, 0, 0)
    mainLayout.addWidget(self.itemstock, 0, 1)
    self.setLayout(mainLayout)
    self.setWindowTitle("Simple Address Book")
    self.setFixedSize(self.sizeHint())

 def updatestock(self,name):
    print(name)
    self.itemstock.addItem(name)

def main():
 app = QApplication(sys.argv)
 ex = menudemo()
 ex.show()
 sys.exit(app.exec_())

if __name__ == '__main__':
 main()

它不起作用,因为您只是在创建一个新的
AddressBook
实例,您需要对它调用一个方法

它未链接到
self.drop\u小部件

您必须使用构造函数链接这两个小部件。您可以在
main

self.pilot_widget=AddInventory()
self.drop_widget=AddressBook()
我会:

self.drop_widget=AddressBook()
self.pilot_widget=AddInventory(self.drop_widget)
并更改
附加库
类参数

class AddInventory(QWidget):
   def __init__(self, drop_widget, parent=None):
      self.drop_widget = drop_widget  # now it is linked in your class as a member
现在,在
中添加

 def add(self,text):
    name=self.name.text()
    self.drop_widget.updatestock(name)
    self.name.clear()

谢谢…像魅力一样工作…如果有很多窗口,那么可以做什么?需要在所有窗口中反映变化。