PyQt: загрузка настроек и обновление виджетов в других классах - PullRequest
0 голосов
/ 13 апреля 2020

Я не могу понять, как правильно загрузить значения QSettings в виджеты других классов. Вот упрощенная версия моего кода:

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

import sys

class MyApp(QMainWindow): #THIS IS THE MAIN WINDOW, THE ONE THAT EVERYTHING IS BUILD ON

    ClassVar = 'UPDATED'

    def __init__(self):
        super().__init__()

        #MAIN WINDOW PROPERTIES
        self.setMinimumSize(QSize(800,480))

        # SETTINGS
        self.settings = QSettings('svetlozar.draganov', 'my.app')

        # LOAD SETTINGS
        try:
            self.resize(self.settings.value('window size'))
            self.move(self.settings.value('window position'))
            #CANNOT REACH VARIABLE - IT IS NOT YET INITIALIZED
            self.tabs_widget.tab_2.qline_parameter_1.setText("TEXT UPDATED")
        except:
            print('CANNOT LOAD SETTINGS')
            pass


        #ADD TAB-WIDGET
        self.tabs_widget = Tabs(self)
        self.setCentralWidget(self.tabs_widget)



    def closeEvent(self, *args, **kwargs):

        # STORE SETTINGS
        self.settings.setValue('window size', self.size())
        self.settings.setValue('window position', self.pos())
        self.settings.setValue('parameter_1', self.tabs_widget.tab_2.qline_parameter_1.text())



class Tabs(QWidget): #HERE THE WINDOW IS SPLIT ON MULTIPLE TABS

    def __init__(self, parent):
        super(QWidget, self).__init__(parent)
        mainLayout = QVBoxLayout()

        self.tabWidget = QTabWidget(self)
        self.tab_1 = Tab_1()
        self.tab_2 = Tab_2()

        self.tabWidget.addTab(self.tab_1, "Tab_1")
        self.tabWidget.addTab(self.tab_2, 'Tab_2')

        mainLayout.addWidget(self.tabWidget)

        self.setLayout(mainLayout)



class Tab_1(QWidget):

    def __init__(self):
        super().__init__()
        mainLayout = QVBoxLayout()
        self.setLayout(mainLayout)


class Tab_2(QWidget):

    def __init__(self):
        super().__init__()

        mainLayout = QFormLayout()

        self.qlabel_parameter_1 = QLabel("Settings Parameter 1:")
        self.qline_parameter_1 = QLineEdit("Settings Parameter 1 Value")


        self.qline_parameter_1.setText(MyApp.ClassVar)

        #CANNOT UPDATE
        try:
            my_app.tabs_widget.tab_2.qline_parameter_1.setText('Text Updated')
        except:
            print('Cannot Update Settings')

        mainLayout.addRow(self.qlabel_parameter_1, self.qline_parameter_1)

        self.setLayout(mainLayout)



if __name__ == "__main__":
    app = QApplication(sys.argv)

    my_app = MyApp()
    my_app.show()

    sys.exit(app.exec_())

Сохранение и загрузка настроек MyApp (QMainWindow) в порядке, поскольку они находятся в классе MyApp (QMainWindow).

Сохранение параметров виджета из с другими классами тоже все в порядке, потому что я могу добраться до виджета, назначив класс переменной, например:

(line 41)self.settings.setValue('parameter_1', self.tabs_widget.tab_2.qline_parameter_1.text())

Загрузка QSettings в эти виджеты, однако я не могу этого сделать выяснить, как это сделать. Например, если я пытаюсь загрузить настройки из класса MyApp (QMainWindow):

(line 24)self.tabs_widget.tab_2.qline_parameter_1.setText("TEXT UPDATED")

Я не могу, потому что виджет еще не инициализирован.

Если я попытаюсь загрузить Настройки в том же классе Tab_2 (QWidget), используя экземпляр класса my_app = MyApp(), я не смогу, потому что он еще не инициализирован.

(line 87)my_app.tabs_widget.tab_2.qline_parameter_1.setText('Text Updated')

Я также пытался заставить класс Tab_2 (MyApp) наследоваться от класса MyApp (QMainWindow), но я получил ошибку рекурсии: RecursionError: maximum recursion depth exceeded while calling a Python object

Единственный способ, который работает, но я не думаю, что это правильно использовать атрибуты класса для MyApp (QMainWindow), например ClassVar = 'UPDATED'. Затем, когда я загружаю это значение в класс Tab_2 (QWidget) через: self.qline_parameter_1.setText(MyApp.ClassVar), кажется, что он работает нормально.

Есть ли лучший способ сделать это? Я действительно не хочу хранить отдельные переменные класса для виджетов вне класса MyApp (QMainWindow).

Заранее спасибо! Остается здоровым! Светлозар Драганов

...