Разверните проект QtQuick QML Python в KDE Linux.

Мне нужен совет, как указать пути к моему QML и ресурсам (значку) в моем простом приложении QtQuick QML Python в KDE. Единственный связанный с этим вопрос, который я нашел здесь, был: Развертывание проекта Qt в Linux

Мой вопрос в другом. Моя единственная цель для развертывания моего приложения — KDE; поэтому мне не нужно связывать библиотеки Qt, и мое приложение не имеет других зависимостей. Мне нужно только развернуть мои файлы python и QML и значок приложения (png).

Еще одна проблема заключается в том, что в будущем я хочу иметь возможность предоставлять определенные обновления только через файлы QML. Я планирую выпускать, когда это необходимо, один новый файл QML без развертывания новой версии приложения.

Это наводит меня на мысль, что мне не следует использовать систему ресурсов Qt. Однако, не имея опыта работы с этой системой или с развертыванием приложений в целом, я прошу совета.

Я не хочу жестко указывать путь к моему значку и основному файлу QML в моем файле main.py при развертывании. Кроме того, следующий код не дает мне расположение ни одного из файлов моего приложения:

QCoreApplication.applicationDirPath()

Он возвращает /usr/bin (местоположение python), которое не подходит для моего файла QML или значка приложения.

Как я могу найти свой QML и файлы ресурсов в выполняющемся методе __main__?

Вот мой main.py:

import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import QUrl
from PyQt5.QtQml import QQmlApplicationEngine
from PyQt5.QtGui import QIcon


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

    engine = QQmlApplicationEngine()
    engine.load(QUrl.fromLocalFile('view.qml'))
    app.setWindowIcon(QIcon('appicon.png'))

    if not engine.rootObjects():
        sys.exit(-1)
    sys.exit(app.exec_())

Вот мой вид.qml

import QtQuick.Window 2.2
import QtQuick 2.2
import QtQuick.Controls 2.14

Window {
    id: root
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    }

Этот код работает, когда я запускаю python main.py из локального каталога. Однако, если я разверну свои файлы python, qml и icon, скажем, на /usr/local/bin, мне придется жестко закодировать этот путь в файле python следующим образом.

    engine.load(QUrl.fromLocalFile('/usr/local/bin/view.qml'))
    app.setWindowIcon(QIcon('/usr/local/bin/appicon.png'))

Я не хочу этого делать. Я ищу другие альтернативы, которые не требуют жесткого кодирования пути.

Этот вопрос не касается упаковки для конкретного дистрибутива. Предположим, я буду использовать что-то вроде "общего" метода, описанного здесь - - например, сценарий оболочки (и предполагается, что устанавливающий пользователь будет иметь права sudo).


person MountainX    schedule 19.01.2020    source источник
comment
Qt Creator помогает связывать файлы ресурсов, поэтому я упомянул об этом. Моя проблема связана с поиском пути к моим файлам QML и значков во время выполнения.   -  person MountainX    schedule 19.01.2020
comment
Мой вопрос не о Qt Creator. В вопросе я упомянул, что я агностик в отношении его использования. Я отредактирую вопрос и удалю любую ссылку на Qt Creator, потому что это, кажется, отвлекает внимание от моего фактического вопроса.   -  person MountainX    schedule 19.01.2020
comment
Думаю, теперь я понимаю лучше. Вы хотите получить путь QML без жесткого кода (без указания полного пути). Где QML связан с .py? Вы также указываете, что ваш проект состоит как минимум из 3 компонентов: .py, .qml и значок. Вы можете предоставить простой и минималистичный пример своего проекта, чтобы лучше понять свою проблему.   -  person eyllanesc    schedule 19.01.2020
comment
@eyllanesc Спасибо. Я могу поместить файлы python, qml и icon в один и тот же каталог. Я отредактирую вопрос, чтобы привести пример.   -  person MountainX    schedule 19.01.2020
comment
@eyllanesc вопрос обновлен.   -  person MountainX    schedule 19.01.2020


Ответы (1)


Идея в этом случае состоит в том, чтобы создать абсолютные пути, используя относительные пути по отношению к основному элементу. Например, в этом случае вы можете использовать путь к каталогу main.py (который можно получить с помощью решений, предоставленных для этого ответа: Как мне получить путь и имя исполняемого в данный момент файла?), чтобы получить другие пути.

import os
import sys

from PyQt5.QtCore import QUrl
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication
from PyQt5.QtQml import QQmlApplicationEngine


CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))


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

    engine = QQmlApplicationEngine()
    engine.load(QUrl.fromLocalFile(os.path.join(CURRENT_DIR, "view.qml")))
    app.setWindowIcon(QIcon(os.path.join(CURRENT_DIR, "appicon.png")))

    if not engine.rootObjects():
        sys.exit(-1)
    sys.exit(app.exec_())
├── appicon.png
├── main.py
└── view.qml
person eyllanesc    schedule 19.01.2020
comment
Это именно то решение, на которое я надеялся. Еще раз спасибо! - person MountainX; 20.01.2020