首页 > 解决方案 > 如何在 Qt 样式表中设置相对路径?

问题描述

我正在尝试使用样式表将图片添加到 PyQt5 中的按钮。如果我使用图片的绝对路径,它工作正常,但我需要使用相对路径。我已经尝试过pythonic方式(注释掉的部分),但它可能因为反斜杠而无法正常工作。我知道 Qt 资源,但我不明白如何使用它们。关联

import os, sys
from PyQt5.QtWidgets import *

class MainWindow(QMainWindow):

    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        #scriptDir = os.path.dirname(os.path.realpath(__file__))
        #pngloc = (scriptDir + os.path.sep + 'resources' + os.path.sep + 'min.png')

        button1 = QPushButton("", self)
        button1.setStyleSheet('QPushButton {'
                               'background-image: url(e:/new/resources/min.png);'
                               '}')

app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())

标签: pythonpyqtpyqt5qtstylesheets

解决方案


如果您想使用相对路径,那么一个不错的选择是使用创建虚拟路径的Qt 资源系统。.qrc 的优点是它们允许应用程序不依赖本地文件,因为资源被转换为 python 代码。

对于这种情况,可以使用以下 .qrc:

资源.qrc

<!DOCTYPE RCC><RCC version="1.0">
  <qresource>
    <file>resources/min.png</file>
  </qresource>
</RCC>

因此,您需要使用 pyrcc5 将 .qrc 转换为 .py:

pyrcc5 resource.qrc -o resource_rc.py

或者

python -m PyQt5.pyrcc_main resource.qrc -o resource_rc.py

然后你需要将文件导入到脚本中:

主文件

import os, sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton

import resource_rc


class MainWindow(QMainWindow):
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        button1 = QPushButton(self)
        button1.setStyleSheet(
            """QPushButton {
                background-image: url(:/resources/min.png);
            }"""
        )


def main():
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()
├── main.py
├── resource.qrc
├── resource_rc.py
└── resources
    └── min.png

推荐阅读