python - 将 QStyle 添加到 Pyqt5

标签 python pyqt pyqt5 pyqt4

我正在将 GUI 应用程序从 PyQt4 转换为 PyQt5。但在 PyQt4 中,我们得到了很多 QStyle,例如 plastiqueCleanlooks 等。但在 PyQt5 中,我们只有 Fusion 样式以及一些普通的旧 Windows 样式.

我们如何向 PyQt5 添加更多自定义样式?

最佳答案

Qt 的许多功能都是通过插件实现的,样式也是如此。所以在这种情况下你必须编译qtstyleplugins:

您可以使用以下过程来编译qtstyleplugins:

  • 在 Windows 上安装 MSVC 2019,在 MacOS 上安装 XCode,在 Ubuntu 上安装 build-essential(如果是其他发行版,那么您应该寻找等效版本)。

  • 安装 Qt,与编译 pyqt5 的版本相同:python -c "from PyQt5.QtCore import QT_VERSION_STR; pr​​int('Qt version', QT_VERSION_STR)"

  • 克隆存储库,然后通过执行以下命令进行编译(如果是 Windows,则必须将 make 更改为 nmake):

    git clone https://code.qt.io/qt/qtstyleplugins.git
    cd qtstyleplugins
    qmake 
    make 
    make install
    

这些命令将在文件夹“qtstyleplugins/plugins/styles/”中生成二进制文件(对于 Linux 为 .so,对于 Windows 为 .dll,对于 MacOS 为 .dylib),您必须将其复制到以下路径:

python -c "import os; from PyQt5 import QtCore; print(os.path.join(QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.PluginsPath), 'styles'))"

输出:

/home/qtuser/Documents/qt_venv/lib/python3.8/site-packages/PyQt5/Qt/plugins/styles

为了方便工作,我创建了一个生成二进制文件的 github 操作:

63477276.yml

name: question_63477276

on: [push]

jobs:
  ci:
    name: ${{ matrix.os.name }} Python-${{ matrix.python }} Qt-${{ matrix.qt }}
    runs-on: ${{ matrix.os.runs-on }}
    strategy:
      fail-fast: false
      matrix:
        os:
          - name: Windows
            extension: "*.dll"
            runs-on: windows-latest
          - name: Linux
            extension: "*.so"
            runs-on: ubuntu-latest
          - name: MacOS
            extension: "*.dylib"
            runs-on: macos-latest
        python: [3.6, 3.7, 3.8]
        qt: [5.15.0]

    steps:
      - name: Checkout
        uses: actions/checkout@v1
      - name: Install Linux dependencies
        if: matrix.os.name == 'Linux'
        run: |
          sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev
      - name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: ${{ matrix.python }}
          architecture: x64
      - name: install pyqt5
        run: pip install pyqt5
      - name: before
        uses: GabrielBB/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b7cfc1d1d59ad6d4c3ded8d9f7c1869985" rel="noreferrer noopener nofollow">[email protected]</a>
        with:
          run: python -c "from PyQt5 import QtWidgets; app = QtWidgets.QApplication([]); print(QtWidgets.QStyleFactory.keys())"
      - name: Install Qt
        uses: jurplel/install-qt-action@v2
        with:
          version: ${{ matrix.qt }}
          dir: ${{ github.workspace }}/qt/
      - name: clone qtstyleplugins
        run: git clone https://code.qt.io/qt/qtstyleplugins.git
      - name: compile qtstyleplugins in Windows
        if: matrix.os.name == 'Windows'
        shell: cmd
        run: |
          call "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Auxiliary/Build/vcvars64.bat"
          cd qtstyleplugins
          qmake
          nmake
          nmake install
      - name: compile qtstyleplugins in Linux or MacOS
        if: matrix.os.name == 'Linux' || matrix.os.name == 'MacOS'
        run: |
          cd qtstyleplugins
          qmake
          make
          make install
      - name: copy binaries
        run: python questions/63477276/search_binaries.py qtstyleplugins/plugins/styles/
      - name: after
        uses: GabrielBB/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e199978783cc808295888e8fa197d0cfd3" rel="noreferrer noopener nofollow">[email protected]</a>
        with:
          run: python -c "from PyQt5 import QtWidgets; app = QtWidgets.QApplication([]); print(QtWidgets.QStyleFactory.keys())"
      - name: upload
        uses: actions/upload-artifact@v2
        with:
          path: qtstyleplugins/plugins/styles/${{ matrix.os.extension }}
          name: qtstyleplugins-${{ matrix.os.name }}-Python${{ matrix.python }}-Qt${{ matrix.qt }}

您可以从 here 下载 pyqt5 5.15 的二进制文件.

测试:

python -c "from PyQt5 import QtWidgets; app = QtWidgets.QApplication([]); print(QtWidgets.QStyleFactory.keys())"

输出:

['bb10dark', 'bb10bright', 'cleanlooks', 'cde', 'motif', 'plastique', 'windowsvista', 'Windows', 'Fusion']

关于python - 将 QStyle 添加到 Pyqt5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63477276/

相关文章:

python - 如何检查 TDD 中是否存在方法?

python - 重复的 Django 模型实例和所有指向它的外键

python - 让按钮执行脚本

python - "GUI becomes unresponsive after clicking the button"

python - QtWebkit:loadFinished 和 loadProgress 槽永远不会执行

python - PyQt5 可执行文件因缺少 DLL 而崩溃

python - 为 QTextEdit 设置字体被忽略,没有明显的原因

python - 如何解决 'str' 在 python 中没有属性 'maketrans' 错误?

python - 如何防止 QTabWidget 滚动按钮获得焦点?

python - 按唯一天数分组并计数