Add QStyles to Pyqt5

前端 未结 1 413
一整个雨季
一整个雨季 2021-01-20 21:15

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 on

1条回答
  •  小鲜肉
    小鲜肉 (楼主)
    2021-01-20 21:58

    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']
    

    0 讨论(0)
提交回复
热议问题