在KDE Linux上部署QtQuick QML Python项目

2024-09-26 22:45:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要关于如何在KDE上的简单QtQuick QML Python应用程序中指定QML和资源(图标)的路径的建议。我在这里找到的唯一相关问题是:Deploy a Qt project on linux

我的问题不同。我部署应用程序的唯一目标是KDE;因此,我不需要捆绑Qt库,我的应用程序也没有其他依赖项。我只需要部署python和QML文件以及一个应用程序图标(png)

另一个问题是,在将来,我希望能够仅通过QML文件提供某些更新。我计划在需要时推出一个新的QML文件,而不必部署新版本的应用程序

这让我相信我不应该使用Qt资源系统。然而,由于缺乏使用该系统或部署应用程序的经验,我寻求建议

我不想在部署时对main.py文件中的图标和主QML文件的路径进行硬编码。此外,以下代码没有提供我的任何应用程序文件的位置:

QCoreApplication.applicationDirPath()

它返回/usr/bin(python的位置),该位置不适合我的QML文件或应用程序图标

如何在正在执行的__main__方法中找到QML和资源文件?

这是我的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和icon文件部署到/usr/local/bin,我必须将该路径硬编码到python文件中,如下所示

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

我不想这样做。我正在寻找其他不涉及硬编码路径的替代方案

这个问题与特定于分销的包装无关。假设我将使用类似here讨论的“通用”方法——例如shell脚本(并假设安装用户将拥有sudo权限)


Tags: 文件fromimport路径app应用程序binmain
1条回答
网友
1楼 · 发布于 2024-09-26 22:45:14

本例中的想法是使用相对于主元素的相对路径创建绝对路径。例如,在本例中,您可以使用main.py目录路径(可以通过对此答案提供的解决方案获得:How do I get the path and name of the file that is currently executing?)来获得其他路径

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

相关问题 更多 >

    热门问题