Разверните проект QtQuick QML Python на KDE Linux - PullRequest
1 голос
/ 19 января 2020

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

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

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

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

Я не хочу жестко кодировать путь к моей иконке и основному файлу QML в моем главном .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_())

Вот мой view.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 и файлы значков, скажем, /usr/local/bin, мне придется жестко закодировать этот путь в файл python следующим образом.

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

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

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

1 Ответ

2 голосов
/ 19 января 2020

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

<b>import os</b>
import sys

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


<b>CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))</b>


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

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

    if not engine.rootObjects():
        sys.exit(-1)
    sys.exit(app.exec_())
├── appicon.png
├── main.py
└── view.qml
...