Доступ к виджету PyQT вне его класса

простая ситуация оказывается довольно сложной.

Моя цель - получить окно для обновления статуса виджета в другом окне. Объяснять:

У меня есть окно A с некоторыми «данными», и я хочу, чтобы они были записаны в виджет textEdit окна B. Специфика главного окна и виджетов

class MainWin(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(1127, 880)

        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.textEdit = QtGui.QTextEdit(self.centralwidget)
        self.textEdit.setGeometry(QtCore.QRect(20, 150, 1081, 661))
        self.textEdit.setObjectName(_fromUtf8("textEdit"))
        self.textEdit.isUndoRedoEnabled ()

В настоящее время мне не удается получить простой метод, который вызывается из другого окна (и другого файла) и может изменить содержимое внутри textEdit. Не уверен, что я делаю неправильно, но когда я пытаюсь импортировать класс или метод из класса, у меня всегда возникают проблемы с

TypeError: несвязанный метод updEdit() должен вызываться с экземпляром MainWin в качестве первого аргумента (вместо этого он ничего не получил)

Я очень открыт для предложений, и спасибо заранее!

Изменить №1

из файла Rep.py (второе окно я просто вызываю)

def addTemplate(self):
        data = self.textBrowser.toPlainText()
        MainWin.MainWin.addText(MainWindow.MainWin,data)
        self.close()

Все, что мне нужно сделать из первого окна, это:

def addText(self,data):
    self.textEdit.setText(data)

Я довольно новичок в ООП, поэтому, пожалуйста, простите меня, если есть какая-то довольно глупая ошибка.


person Eloh666    schedule 30.09.2015    source источник
comment
Добавьте в свой класс метод, который устанавливает текст, а затем вызываете его из любого места.   -  person multivac    schedule 30.09.2015
comment
Покажите код, где вы пытаетесь вызвать этот метод. Вероятно, вы пытаетесь вызвать его в классе MainWin, а не в его экземпляре.   -  person mata    schedule 30.09.2015
comment
Обновлено, возможно, я делаю ошибку, о которой вы упомянули, но я не уверен, как ее исправить.   -  person Eloh666    schedule 01.10.2015


Ответы (1)


Когда вы создаете второе окно, передайте ссылку на первое окно и сохраните ее как атрибут:

class SecondWindow(QMainWindow):
    def __init__(self, firstwindow, parent=None):
        super(SecondWindow, self).__init__(parent)
        self.firstwindow = firstwindow
        ...            

    def addTemplate(self):
        data = self.textBrowser.toPlainText()
        self.firstwindow.addText(data)

Если вторым окном является QMainWindow или QDialog, вы также можете сделать первое окно родительским для второго окна - в этом случае не нужно будет хранить его как атрибут, и вы можете просто сделать:

        self.parent().addText(data)

Это также означает, что второе окно автоматически закроется, когда закроется первое окно.

person ekhumoro    schedule 30.09.2015
comment
Спасибо, я пытался, но когда я пытаюсь указать первое окно в качестве аргумента для метода, я получаю AttributeError: объект «модуль» не имеет атрибута «MainWindow» (который, кстати, является именем первого). То, что я передаю в init, это mainWin.MainWindow. Я ранее импортировал mainWin, однако в середине у меня может быть цикл с импортом как: второе окно запускается из первого, поэтому я импортировал в первое. Также мне нужно отредактировать первое окно со вторым. В любом случае, еще раз спасибо! - person Eloh666; 02.10.2015