Изменить размер стрелки QSpinBox без изменения стиля приложения

Я пытаюсь найти способ изменить свойства виджета, такие как размер компонента или различные границы и цвета, без изменения стиля виджета по умолчанию (в данном случае слияния). Все еще пытаясь разобраться в таблицах стилей в PyQT, может кто-нибудь объяснить, как добиться больших кнопок со стрелками без изменения стиля?

Заранее спасибо.

if __name__ == '__main__':
    app = QApplication(sys.argv)

    app.setStyle("fusion")
    #Trying to change the arrow size here, while maintaining their "fusion" style
    app.setStyleSheet("QSpinBox::up-button { width: 32px; }"
                      "QSpinBox::down-button { width: 32px; }")
    windowExample = basicWindow()
    windowExample.show()
    sys.exit(app.exec_())

Без app.setStyleSheetС app.setStyleSheet


Я также использую прокси-стиль для своих ползунков, чтобы изменить размер ползунка, надеясь, что есть что-то подобное для спинбокса:

class SliderProxyStyle(QProxyStyle):
    def pixelMetric(self, metric, option, widget):
        if metric == QStyle.PM_SliderThickness:
            return 20
        elif metric == QStyle.PM_SliderLength:
            return 40
        return super().pixelMetric(metric, option, widget)

person Jkind9    schedule 23.02.2021    source источник


Ответы (1)


Вы не можете, не с простыми таблицами стилей, как объяснено в нижней части документация по элементам управления:

В сложных виджетах, таких как QComboBox и QScrollBar, если одно свойство или подчиненный элемент управления настроено, все остальные свойства или подчиненные элементы управления также должны быть настроены.

Сложные виджеты также включают в себя все подклассы QAbstractSpinBox, от которых наследуется QSpinBox, поэтому, если вы измените какое-либо из свойств (кроме цвета фона и переднего плана), вам придется предоставить все остальное, так как базовая реализация стиля будет игнорироваться при использовании базовый QCommonStyle как запасной вариант.

Единственным жизнеспособным решением является использование QProxyStyle и реализация subControlRect для SC_SpinBoxUp, SC_SpinBoxDown и SC_SpinBoxEditField:

class Proxy(QtWidgets.QProxyStyle):
    def subControlRect(self, control, opt, subControl, widget=None):
        rect = super().subControlRect(control, opt, subControl, widget)
        if control == self.CC_SpinBox:
            if subControl in (self.SC_SpinBoxUp, self.SC_SpinBoxDown):
                rect.setLeft(opt.rect.width() - 32)
            elif subControl == self.SC_SpinBoxEditField:
                rect.setRight(opt.rect.width() - 32)
        return rect

# ...
app = QtWidgets.QApplication(sys.argv)
app.setStyle(Proxy())
# ...
person musicamante    schedule 23.02.2021
comment
Пробовал это безуспешно, за исключением того, что теперь мои ползунки также изменили формат, возможно, потому, что они уже изменены с помощью класса прокси-стиля? - person Jkind9; 23.02.2021
comment
@ Jkind9 обратите внимание, что вы не должны больше не использовать таблицу стилей в этих счетчиках: как сказано, если вы используете таблицы стилей, вы переопределяете стиль (что сделало бы реализацию прокси почти бесполезной). Проблема с ползунками возникает из-за того, что в зависимости от стиля некоторые атрибуты используются для слегка связанных виджетов, вы можете убедиться, что widget является экземпляром QSpinBox (или даже установить свое собственное свойство и проверить его, если вы хотите стилизовать разные счетчики по-разному). - person musicamante; 23.02.2021
comment
(на самом деле немного странно, что вы также изменяете ползунки, чего не должно быть в стиле слияния; убедитесь, что вы уже не используете другой стиль прокси или что вы не используете пользовательскую таблицу стилей, такую ​​​​как QDarkStyleSheet.) - person musicamante; 23.02.2021
comment
Да, я тоже пытался удалить строку app.setStyle(___) . Я не использую никаких таблиц стилей, кроме слияния, и использую палитру для изменения цветов. Размер кнопок вроде бы не изменился. Понятно, не могли бы вы отредактировать свой ответ, чтобы показать, как я исправлю проблему с ползунком? Как я уже сказал, я очень новичок в PyQt, я боюсь! - person Jkind9; 23.02.2021
comment
Если вы удалите эту строку, стиль прокси не будет использоваться. Проверьте, используете ли вы таблицу стилей в каком-либо из родителей (или также в QApplication). - person musicamante; 23.02.2021
comment
Обновлен мой вопрос, чтобы показать мой стиль Slider Proxy, может ли это быть проблемой? - person Jkind9; 23.02.2021
comment
Давайте продолжим обсуждение в чате. - person Jkind9; 23.02.2021
comment
Подождите, вы уже используете другой стиль прокси? Вы должны были это упомянуть. Во-первых, QStyle (и его подклассы, включая QProxyStyle) и таблица стилей плохо работают вместе. Затем, если у вас уже есть прокси, внедрите в него subControlRect. - person musicamante; 23.02.2021