Используйте свойства, объявленные в отдельном файле Python в QML.Python

Программы на Python
Ответить
Anonymous
 Используйте свойства, объявленные в отдельном файле Python в QML.

Сообщение Anonymous »

Я хочу поддерживать порядок в своем проекте, поэтому я подумал о перемещении свойств из файла «main.py» в другой файл под названием «CustomVariables.py». Но теперь я получаю сообщение «TypeError: невозможно прочитать свойство loaderSource неопределенного значения». Когда вы раскомментируете комментарии в приведенном ниже коде, все работает нормально, однако я не хочу объявлять свойства внутри класса «BG». Может ли кто-нибудь подсказать мне, как правильно это настроить?
CustomVariables.py

Код: Выделить всё

from PySide6.QtCore import QObject, Property, Signal

class CustomVariables(QObject):
def __init__(self):
QObject.__init__(self)
self.loaderSource = 'PageWork.qml'

def get_loaderSource(self):
return self._loaderSource

def set_loaderSource(self, new_loaderSource):
self._loaderSource = new_loaderSource
self.loaderSourceChanged.emit()

loaderSourceChanged = Signal()

loaderSource = Property(str, get_loaderSource, set_loaderSource, notify=loaderSourceChanged)
main.py

Код: Выделить всё

import sys
from pathlib import Path

from PySide6.QtGui import QGuiApplication
from PySide6.QtQml import QQmlApplicationEngine
from PySide6.QtCore import QObject, Property, Signal

from CustomVariables import CustomVariables

class BG(QObject):
def __init__(self):
QObject.__init__(self)
# self.loaderSource = 'PageWork.qml'

cv = CustomVariables()

# def get_loaderSource(self):
#     return self._loaderSource
# def set_loaderSource(self, new_loaderSource):
#     self._loaderSource = new_loaderSource
#     self.loaderSourceChanged.emit()
# loaderSourceChanged = Signal()
# loaderSource = Property(str, get_loaderSource, set_loaderSource, notify=loaderSourceChanged)

if __name__ == "__main__":
app = QGuiApplication(sys.argv)
engine = QQmlApplicationEngine()

background = BG()
engine.rootContext().setContextProperty("bg", background)

qml_file = Path(__file__).resolve().parent / "main.qml"
engine.load(qml_file)
if not engine.rootObjects():
sys.exit(-1)
sys.exit(app.exec())
main.qml

Код: Выделить всё

import QtQuick.Controls.FluentWinUI3
import QtQuick

Window {
id: root
width: 1280
height: 720
visible: true

Loader {
id: projectLoader
anchors.fill: parent
asynchronous: true
source: bg.cv.loaderSource
//source: bg.loaderSource
}
}

Я также пытался объявить «cv» внутри «init»:

Код: Выделить всё

self.cv = CustomVariables()
но все равно безуспешно

Подробнее здесь: https://stackoverflow.com/questions/793 ... ile-in-qml
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»