-1

I am using python and pyqt6.

I have a maindwindow A, it has a mdi area with a subwindow havig a qlineedt and a button, when i press the button a pop up window appears which is another class from within the same program, the popup window has qlineedit and a button, when i enter a value in the qlineedit and press the button, the popup window closes and the value of the qlineedit is transferred to the qlineedit of the subwindow, I tried this code:

A.subwindow.settext(self.textedit.text())

but it does not work. The error is "qmainwindow A has no attribute subwindow" I also tried this:

A.mdi.subwindow.settext(self.textedit.text())

And the error is "qmainwindow A has no attribute mdi" I declared mdi as:

self.mdi = QMdiArea()
windowLayout.addWidget(self.mdi)

And subwindow as :

self.subwindow = QMdiSubWindow()
self.mdi.addSubWindow(self.subwindow)
self.subwindow.show()  

Here's the minimal code that produces the same error:

import PyQt6.QtWidgets   as qtw
import PyQt6.QtCore as qtc
import sys 
import os 

class Minwindow(qtw.QMainWindow): 
    def __init__(self):
        super().__init__()
        self.mdi = qtw.QMdiArea()
        widget = qtw.QWidget()
        self.setCentralWidget(widget)
        windowLayout = qtw.QHBoxLayout(widget)
        windowLayout.addWidget(self.mdi, )
        
        pbSub = qtw.QPushButton('Sub', self)
        pbSub.setGeometry(9, 9, 75, 20)
        pbSub.clicked.connect(self.on_click_sub)
        self.setGeometry(125,75,350,300)
    def on_click_sub(self):
        self.subw = qtw.QMdiSubWindow()
        self.subw.txtusr = qtw.QLineEdit('', self.subw)
        self.subw.txtusr.setGeometry(25,30,100,25)
        pbPop = qtw.QPushButton('Pop', self.subw)
        pbPop.setGeometry(50, 75, 75, 20)
        pbPop.clicked.connect(self.on_click_pop)
        self.subw.setGeometry(75, 75, 200, 150)
        self.subw.setWindowTitle("Create User")
        self.mdi.addSubWindow(self.subw)
        self.subw.show() 
    def on_click_pop(self):        
        self.showPopup()
    def showPopup(self):
        name = 'POPS'
        self.dpop = Popw(name)        
        self.dpop.move(self.pos().x()+75, self.pos().y()+75)
        self.dpop.setFixedSize(200, 150)
        self.dpop.show()   
class Popw(qtw.QMainWindow):
    def __init__(self, name):
        super().__init__()        
        self.name = name
        #self.setGeometry(100, 100, 300, 350)
        self.setWindowFlags(qtc.Qt.WindowType.Window | qtc.Qt.WindowType.CustomizeWindowHint | qtc.Qt.WindowType.WindowStaysOnTopHint)
        self.initUI()
    def initUI(self):
        ntxtusr = qtw.QLineEdit('', self)
        ntxtusr.setGeometry(25,30,100,25)
        pbOk = qtw.QPushButton('Ok', self)
        pbOk.setGeometry(50, 75, 75, 20)
        pbOk.clicked.connect(self.on_click_ok) 
    def on_click_ok(self):
        Minwindow.mdi.subw.txtusr.setText(ntxtusr.text())
        self.close()
    
if __name__ == "__main__":       
    app = qtw.QApplication(sys.argv)
 
    mainl = Minwindow()
    mainl.show()
    sys.exit(app.exec())        
        
  • always put full error message (starting at word "Traceback") in question (not in comments) as text (not screenshot, not link to external portal). There are other useful information. – furas Jun 04 '22 at 16:39
  • better show minimal working code which we could copy and test. You have to show how you create `maindwindow`. You have to use `instance` of window but it seems you use `class`. But it may be better to send mainwidow as parameter to subwindow. ie; self.subwindow.mainwindow = self` and later inside subwindow use `self.mainwindow`. Eventually check if subwindow has variable like `.parent` to access parent window. – furas Jun 04 '22 at 16:42
  • Please provide a [mre]. – musicamante Jun 04 '22 at 18:01
  • I just updated my question with the sample code that reproduces the error – Blas Lomibao Jun 04 '22 at 22:58

1 Answers1

0

I have solved this problem by introducing a global variable and pass the text value from qlineedit of popup window to this global variable and in qtimer, if the global variable is not empty, it will update the text in qlineedit of mdi subwindow.

here is the rest of the code:

import PyQt6.QtWidgets   as qtw
import PyQt6.QtCore as qtc
import sys 

ntexx = ''
class Minwindow(qtw.QMainWindow): 
    def __init__(self):
        super().__init__()
        self.mdi = qtw.QMdiArea()
        widget = qtw.QWidget()
        self.setCentralWidget(widget)
        windowLayout = qtw.QHBoxLayout(widget)
        windowLayout.addWidget(self.mdi, )
        
        pbSub = qtw.QPushButton('Sub', self)
        pbSub.setGeometry(9, 9, 75, 20)
        pbSub.clicked.connect(self.on_click_sub)
        timer = qtc.QTimer(self) 
        # adding action to timer
        timer.timeout.connect(self.showTime)  
        # update the timer every second
        timer.start(500)
        
        self.setGeometry(125,75,350,300)
    def showTime(self):
        global ntexx
        if ntexx != '':
           self.subw.txtusr.setText(ntexx)
           ntexx = ''
        
    def on_click_sub(self):
        self.subw = qtw.QMdiSubWindow()
        self.subw.txtusr = qtw.QLineEdit('', self.subw)
        self.subw.txtusr.setGeometry(25,30,100,25)
        pbPop = qtw.QPushButton('Pop', self.subw)
        pbPop.setGeometry(50, 75, 75, 20)
        pbPop.clicked.connect(self.on_click_pop)
        self.subw.setGeometry(75, 75, 200, 150)
        self.subw.setWindowTitle("Create User")
        self.mdi.addSubWindow(self.subw)
        self.subw.show() 
    def on_click_pop(self):        
        self.showPopup()
 
    def showPopup(self):
        name = 'POPS'
        self.dpop = Popw(name)        
        self.dpop.move(self.pos().x()+75, self.pos().y()+75)
        self.dpop.setFixedSize(200, 150)
        self.dpop.show()   
class Popw(qtw.QMainWindow):
    def __init__(self, name):
        super().__init__()        
        self.name = name
        #self.setGeometry(100, 100, 300, 350)
        self.setWindowFlags(qtc.Qt.WindowType.Window | qtc.Qt.WindowType.CustomizeWindowHint | qtc.Qt.WindowType.WindowStaysOnTopHint)
        self.initUI()
    def initUI(self):
        self.ntxtusr = qtw.QLineEdit('', self)
        self.ntxtusr.setGeometry(25,30,100,25)
        pbOk = qtw.QPushButton('Ok', self)
        pbOk.setGeometry(50, 75, 75, 20)
        pbOk.clicked.connect(self.on_click_ok) 
    def on_click_ok(self):
        #Minwindow.mdi.subw.txtusr.setText(ntxtusr.text())
        global ntexx
        ntexx = self.ntxtusr.text()
        self.close()
    
if __name__ == "__main__":       
    app = qtw.QApplication(sys.argv)
 
    mainl = Minwindow()
    mainl.show()
    sys.exit(app.exec())