简体   繁体   中英

Add QStyles to Pyqt5

I'm converting my GUI application from PyQt4 to PyQt5. But in PyQt4 we get so many QStyles like plastique , Cleanlooks etc. But in PyQt5 we have only Fusion style along with some plain old Windows styles.

How can we add more custom styles to PyQt5?

Many of Qt's functionalities are implemented by plugins, and that is the case with styles. So in this case you must compile qtstyleplugins:

You can use the following procedure to compile qtstyleplugins:

  • Install MSVC 2019 on Windows, XCode on MacOS and build-essential on Ubuntu (in case of another distro then you should look for the equivalent).

  • Install Qt, the same version with which pyqt5 was compiled: python -c "from PyQt5.QtCore import QT_VERSION_STR; print('Qt version', QT_VERSION_STR)" .

  • Clone the repository and then compile it by executing the following commands (in the case of windows you must change make to nmake):

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

These commands will generate the binaries (.so for Linux, .dll for windows and.dylib for MacOS) in folder "qtstyleplugins/plugins/styles/" that you must copy to the path:

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

Output:

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

To facilitate the work I have created a github action that generates the binaries:

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/xvfb-action@v1.2
        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/xvfb-action@v1.2
        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 }}

and you can download the binaries for pyqt5 5.15 from here .

Test:

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

Output:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM