已关联但未正确回复的课程

时间:2015-12-02 23:27:30

标签: python-2.7 class methods pyqt4

我正在尝试连接两个不同类的两个方法。在名为“Ventana”的班级,这是我的主要窗口,我有这个方法:

def addChannel(self):
    global channelCount

    self.scrollLayout = QFormLayout()

    self.canal = QwtPlot()
    self.canal.setLayout(self.scrollLayout)

    if channelCount <= 4:                                
        self.splitter1.addWidget(self.canal)
        channelCount += 1
        print str(channelCount)

在另一堂课中,我有这些方法:

class QwtPlotList(QDialog):
def __init__(self):
    QDialog.__init__(self)
    uic.loadUi("PropiedadesCanal.ui", self)
    self.botonAdd.clicked.connect(self.addChannel_2)

def addChannel_2(self):
    global channelCount
    self.botonAdd.clicked.connect(Ventana().addChannel)
    if channelCount <= 4:
        self.listWidget.addItem("Canal : " + str(channelCount))

我要做的是,当我按下“botonAdd”按钮时,“addChannel_2”方法会调用{{1}中的“addChannel”方法}类。然后,创建Ventana(“self.canal”)。

这段代码会发生什么,当我按下“QWidget”时,它会将一个项目放在botonAdd中,但它不会创建listWidget。如果我使用工具栏中的按钮创建“QWidget”,则不会在QWidget

中添加任何项目

您可以在这些图片中看到所有这些:

The "botonAdd" creates an item in the QListWidget but not a QWidget

Another button creates the Qwidget, but not the item in the QListWidget

希望你能帮助我。感谢您的时间和答案

1 个答案:

答案 0 :(得分:1)

有几个问题

1。从另一个类调用类Ventana中的函数。你做了什么:

    self.botonAdd.clicked.connect(Ventana().addChannel)

Ventana()创建了类Ventana的新实例。该     按钮botonAdd未连接到您的主窗口,它是     连接到刚刚创建的另一个主窗口。这个新窗口     未显示,并被销毁,添加addChannel_2的结尾     垃圾收集器(因为你没有保留对它的引用)。

要调用右addChannel,您需要引用实际的主窗口。在Qt中,主窗口通常是另一个窗口小部件的父窗口。您需要更改QwtPlotList的定义,以便它可以拥有父级:

    class QwtPlotList(QDialog):
      def __init__(self,parent):
        QDialog.__init__(self,parent)

    #in main window Ventana
    self.myDialog=QwtPlotList(self)

然后,您可以在Ventana中调用QwtPlotList的任何方法:

    #in QwtPlotList
    self.parent().any_method()

2。连接按钮单击多功能。你做了什么:

    self.botonAdd.clicked.connect(self.function1)

    def function1(self):
      self.botonAdd.clicked.connect(function2)

每次单击该按钮,都会调用function1,并将按钮单击连接到另一个功能。这些连接是附加的。第一次单击该按钮时,将调用function1,并且该按钮将连接到function2。第二次调用function1function2,按钮连接到function2。第三次调用function1function2function2,等等。

您只需拨打function2即可,无需连接按钮:

def function1:
  function2()

3。使用全局变量:您应该避免使用全局变量,这通常是更好的解决方案。
  我知道你有两个函数需要使用相同的变量channelCount。为了避免全局,我会在channelCount中保留对QwtPlotList的引用,并将其作为参数传递给addChannel

def addChannel(channelCount):
  channelCount+=1
  return channelCount

#QWtPlotList 
  #init
    self.channelCount=3  

  def addChannel_2(self):
    self.channelCount=addChannel(self.channelCount)

我让你弄明白如何将所有东西放在一起:)