Как установить новый QStyle для PyQt?

2

Я пишу графический интерфейс в PyQt4PyQt5 на PyQt5). Вот как я запускаю свой графический интерфейс:

if __name__== '__main__':
    app = QApplication(sys.argv)
    QApplication.setStyle(QStyleFactory.create('Fusion')) # <- Choose the style
    myGUI = MyMainWindow("First GUI")
    app.exec_()

Стили по умолчанию в PyQt4:

По-видимому, PyQt4 имеет следующие стили:

  • 'Windows'
  • 'WindowsXP'
  • 'WindowsVista'
  • 'Motif'
  • 'CDE'
  • 'Plastique'
  • 'Cleanlooks'

Стили по умолчанию в PyQt5:

PyQt5 имеет следующие стили:

  • 'Windows'
  • 'WindowsXP'
  • 'WindowsVista'
  • 'Fusion'

Пользовательские стили?

Ни один из этих стилей не имеет надлежащей поддержки для дисплеев HiDpi (4k и т.п.). Например, полосы прокрутки слишком малы (см. Это сообщение: Как изменить размер полосы прокрутки из QTextEdit в PyQt?). И я даже не упоминал о проблемах для этих людей с нерезким зрением.

Знаете ли вы стиль (желательно с открытым исходным кодом), который обеспечивает хорошую поддержку для 4k дисплеев или для людей с проблемами зрения?

Если да, как можно загрузить этот стиль и установить его?

Огромное спасибо.

  • 0
    Вы видели документацию Qt High DPI ?
  • 0
    Спасибо @TheCompiler. Как я могу практически реализовать это в Python?
Показать ещё 1 комментарий
Теги:
python-3.x
pyqt4
pyqt5
pyqt

1 ответ

2
Лучший ответ

Я получил ответ (или скажу об обходном пути) через другой вопрос: как сделать Icon в QMenu больше (PyQt)?

Самый простой способ создания нового QStyle - вывести его из существующего. PyQt предоставляет класс QProxyStyle для этой цели. Ниже приведен пример, который я также дал в " Как сделать значок в QMenu больше (PyQt)? вопрос. В этом примере создается пользовательский QStyle (полученный из стиля Fusion), а пользовательский стиль предоставляет очень большие значки для QMenu.

import sys
import os
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *

# Create a custom "QProxyStyle" to enlarge the QMenu icons
#-----------------------------------------------------------
class MyProxyStyle(QProxyStyle):
    pass
    def pixelMetric(self, QStyle_PixelMetric, option=None, widget=None):

        if QStyle_PixelMetric == QStyle.PM_SmallIconSize:
            return 40
        else:
            return QProxyStyle.pixelMetric(self, QStyle_PixelMetric, option, widget)


# This is the main window class (with a simple QMenu implemented)
# ------------------------------------------------------------------
class TestWindow(QMainWindow):
    def __init__(self):
        super(TestWindow, self).__init__()

        # 1. Set basic geometry and color.
        self.setGeometry(100, 100, 400, 400)
        self.setWindowTitle('Hello World')
        palette = QPalette()
        palette.setColor(QPalette.Window, QColor(200, 200, 200))
        self.setPalette(palette)

        # 2. Create the central frame.
        self.centralFrame = QFrame()
        self.centralFrame.setFrameShape(QFrame.NoFrame)
        self.setCentralWidget(self.centralFrame)

        # 3. Create a menu bar.
        myMenuBar = self.menuBar()
        fileMenu = myMenuBar.addMenu("&File")

        testMenuItem = QAction(QIcon("C:\\my\\path\\myFig.png"), "&Test", self)
        testMenuItem.setStatusTip("Test for icon size")
        testMenuItem.triggered.connect(lambda: print("Menu item has been clicked!"))

        fileMenu.addAction(testMenuItem)

        # 4. Show the window.
        self.show()

# Start your Qt application based on the new style
#---------------------------------------------------
if __name__== '__main__':
    app = QApplication(sys.argv)
    myStyle = MyProxyStyle('Fusion')    # The proxy style should be based on an existing style,
                                        # like 'Windows', 'Motif', 'Plastique', 'Fusion', ...
    app.setStyle(myStyle)

    myGUI = TestWindow()

    sys.exit(app.exec_())

Просто скопируйте фрагмент кода и вставьте его в файл *.py. Конечно, вы должны заменить путь к значку допустимым путем на вашем локальном компьютере. Просто укажите полный путь ("C:.."), чтобы убедиться, что Qt находит рисунок значка.

Попробуйте, и вы должны получить следующее окно:

Изображение 174551

Ещё вопросы

Сообщество Overcoder
Наверх
Меню