Я пишу графический интерфейс в PyQt4
(и PyQt5
на 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 дисплеев или для людей с проблемами зрения?
Если да, как можно загрузить этот стиль и установить его?
Огромное спасибо.
Я получил ответ (или скажу об обходном пути) через другой вопрос: как сделать 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 находит рисунок значка.
Попробуйте, и вы должны получить следующее окно: