PyQt类继承

问题描述 投票:2回答:2

我很难理解Python / PyQt的类继承。我有一个MainWindow和一个弹出窗口QWidget。在弹出窗口中打开self.label1后,我想与MainWindowQWidget进行交互,但是我不知道该怎么做。我只知道另一种方法,可以从MainWindow内的弹出窗口访问所有小部件,反之亦然。

这里是一个示例,在新窗口中打开self.label1后,MainWindowMyPopup应该得到另一个文本:

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_())
python class inheritance pyqt
2个回答
5
投票

您需要将主窗口作为参数传递给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_())

0
投票

这是Alvaro Fuentes的先前回答,对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_())
© www.soinside.com 2019 - 2024. All rights reserved.