Я не могу понять, как правильно загрузить значения 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).
Заранее спасибо! Остается здоровым! Светлозар Драганов