Classes connected but don´t respond properly
i´m trying to connect two methods which are in two different classes. In the class called "Ventana", which is my main window, i have this method:
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)
In another class, i have these methods:
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))
What i´m trying to do is that, when i push the button "botonAdd", the "addChannel_2" method calls the "addChannel" method, which is in the Ventana class. Then, a QWidget ("self.canal") is created.
What happens with this code, it is that when i push the "botonAdd", it puts an item in the listWidget but it doesn´t create the QWidget. And if i create the "QWidget" with a button in a toolbar, it doesn´t add any item in the QListWidget
You can see all this in these images:
Hope you can help me. Thanks for your time and answers
There is several issues
1. Calling a function in the class Ventana from another class. What you do:
Ventana() creates a new instance of the class Ventana. The button botonAdd is not connected to your main window, it is connected to another main window you just created. This new window is not shown, and is destroyed add the end of addChannel_2 by the garbage collector (because you don't keep a reference to it).
To call the right addChannel, you need a reference to your actual main window. In Qt, the main window is usually the parent of the other widget. You need to change the definition of QwtPlotList so that it can have a parent:
class QwtPlotList(QDialog): def __init__(self,parent): QDialog.__init__(self,parent) #in main window Ventana self.myDialog=QwtPlotList(self)
Then you can call any method of Ventana in QwtPlotList:
#in QwtPlotList self.parent().any_method()
2. Connecting button click to multitple functions. What you do:
self.botonAdd.clicked.connect(self.function1) def function1(self): self.botonAdd.clicked.connect(function2)
Every time the button is click, function1 will be called, and will connect the button click to another function. Those connections are additive. The first time you click the button, function1 is called and the button is connect to function2. The second time, function1 and function2 are called, and the button is connect to function2. The third time, function1, function2 and again function2 are called, etc.
You need to simply call the function2, without connecting the button:
def function1: function2()
3. Using globals: you should avoid it, there's often a better solution. I understand you have two functions that need to use the same variable channelCount. To avoid global, I would keep a reference to channelCount in QwtPlotList, and pass it as a parameter in addChannel
def addChannel(channelCount): channelCount+=1 return channelCount #QWtPlotList #init self.channelCount=3 def addChannel_2(self): self.channelCount=addChannel(self.channelCount)
I let you figure out how to put everything together :)