Наследяване на клас PyQt

Имам проблеми с разбирането на наследяването на класове с Python/PyQt. Имам MainWindow и изскачащ прозорец QWidget. Искам да взаимодействам с self.label1 на MainWindow, след като QWidget беше отворен в изскачащ прозорец, но не знам как да го направя. Знам само обратното, да достигна до всички джаджи от изскачащия прозорец вътре в MainWindow, но не и обратното.

Ето един пример, self.label1 от MainWindow трябва да получи друг текст, след като MyPopup се отвори в нов прозорец:

import sys
from PyQt4.Qt import *

class MyPopup(QWidget):
    def __init__(self):
        QWidget.__init__(self)

        # I want to change the lable1 of MainWindow
        self.cw.label1.setText('hello')


class MainWindow(QMainWindow):
    def __init__(self, *args):
        QMainWindow.__init__(self, *args)
        self.cw = QWidget(self)
        self.setCentralWidget(self.cw)
        self.btn1 = QPushButton("Click me", self.cw)
        self.btn1.setGeometry(QRect(50, 50, 100, 30))
        self.label1 = QLabel("No Commands running", self.cw)
        self.connect(self.btn1, SIGNAL("clicked()"), self.doit)
        self.w = None

    def doit(self):
        self.w = MyPopup()
        self.w.setGeometry(QRect(100, 100, 400, 200))
        self.w.show()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    myapp = MainWindow()
    myapp.show()
    sys.exit(app.exec_())

person honeymoon    schedule 11.02.2014    source източник


Отговори (2)


Трябва да предадете главния прозорец като параметър на конструктора на MyPopup, опитайте това:

import sys
from PyQt4.Qt import *

class MyPopup(QWidget):
    def __init__(self, mainWindow):
        QWidget.__init__(self)

        # use the mainWindow passed as parameter
        mainWindow.label1.setText('hello')


class MainWindow(QMainWindow):
    def __init__(self, *args):
        QMainWindow.__init__(self, *args)
        self.cw = QWidget(self)
        self.setCentralWidget(self.cw)
        self.btn1 = QPushButton("Click me", self.cw)
        self.btn1.setGeometry(QRect(50, 50, 100, 30))
        self.label1 = QLabel("No Commands running", self.cw)
        self.connect(self.btn1, SIGNAL("clicked()"), self.doit)
        self.w = None

    def doit(self):
        self.w = MyPopup(self) #when creating the popup pass in the main window
        self.w.setGeometry(QRect(100, 100, 400, 200))
        self.w.show()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    myapp = MainWindow()
    myapp.show()
    sys.exit(app.exec_())
person Alvaro Fuentes    schedule 11.02.2014
comment
Благодаря ви много и се извинявам за този тъп въпрос. Бавно свиквам с часовете... - person honeymoon; 11.02.2014
comment
можете ли да ми помогнете, моля, stackoverflow.com/questions/52753678/ - person abhi krishnan; 11.10.2018

Това е предишният отговор от Алваро Фуентес, с незначителните актуализации, необходими за PyQt5.

import sys
from PyQt5.Qt import *

class MyPopup(QWidget):
    def __init__(self, mainwin):
        QWidget.__init__(self)

        # I want to change the lable1 of MainWindow
        mainwin.label1.setText('hello')


class MainWindow(QMainWindow):
    def __init__(self, *args):
        QMainWindow.__init__(self, *args)
        self.cw = QWidget(self)
        self.setCentralWidget(self.cw)
        self.btn1 = QPushButton("Click me", self.cw)
        self.btn1.setGeometry(QRect(50, 50, 100, 30))
        self.label1 = QLabel("No Commands running", self.cw)
        self.btn1.clicked.connect(self.doit)
        self.w = None

    def doit(self):
        self.w = MyPopup(self)
        self.w.setGeometry(QRect(100, 100, 400, 200))
        self.w.show()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    myapp = MainWindow()
    myapp.show()
    sys.exit(app.exec_())
person WesR    schedule 31.01.2020