Я нашел этот пост, который почти отвечает на мой вопрос (и в конечном итоге мне, возможно, придется использовать это решение): Изменить Изображение флажка PySide QGroupBox. Проблема в том, что приведенный там ответ предлагает использовать собственные изображения флажков, тогда как я хочу использовать встроенный расширитель для конкретной ОС, например, в QTreeView, который на моем ПК выглядит следующим образом:

Возможно ли это вообще? Расширители считаются стилизованным флажком или чем-то совершенно другим? Я новичок в Qt, поэтому не очень хорошо знаком с тем, как обрабатываются стили. Могу ли я запросить это, и если да, то будет ли это вообще совместимо со стилями QCheckBox? На странице документации QTreeView я мало что нашел о расширителях, кроме их включения/отключения, и в настоящее время я пытаюсь покопаться в исходном коде QTreeView.cpp, чтобы выяснить, как они работают.Обновление
Отходя от ответа eyllanesc, я приближаюсь к решению, но у меня возникают некоторые проблемы с переопределением методов QProxyStyle. Я пытаюсь сделать что-то вроде следующего:
Код: Выделить всё
class GroupBoxExpanderStyle(QtWidgets.QProxyStyle):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._replaceCheckboxWithExpander = False
def drawComplexControl(self, control, option, painter, widget):
try:
if control == QtWidgets.QStyle.CC_GroupBox and widget.isCheckable():
self._replaceCheckboxWithExpander = True
super().drawComplexControl(control, option, painter, widget)
finally:
self._replaceCheckboxWithExpander = False
def drawPrimitive(self, element, option, painter, widget):
if element == QtWidgets.QStyle.PE_IndicatorCheckBox and self._replaceCheckboxWithExpander:
indicatorBranchOption = ... # Set up options for drawing PE_IndicatorBranch
super().drawPrimitive(QtWidgets.QStyle.PE_IndicatorBranch, indicatorBranchOption, painter, widget)
else:
super().drawPrimitive(element, option, painter, widget)
Код: Выделить всё
proxy()->drawPrimitive(PE_IndicatorCheckBox, &box, p, widget);
Я не совсем понимаю, как это сделать. займитесь отладкой этого, так как я не могу войти в код C++, чтобы увидеть, что на самом деле вызывается. Может ли кто-нибудь предложить какие-либо предложения, которые помогут мне понять, почему мой переопределенный drawPrimitive() не вызывается?
Обновление 2:
Я разгадал загадку того, почему мой переопределенный метод drawPrimitive() не вызывается - это потому, что мое приложение использует таблицу стилей корневого уровня, которая вызывает QStyleSheetStyle для использования в качестве активного стиль для виджетов. QStyleSheetStyle напрямую вызывает свой собственный метод drawPrimitive() для CC_GroupBox вместо вызова proxy()->drawPrimitive() - мне это кажется ошибкой, и на самом деле эта ошибка Qt гласит, что таблицы стилей плохо сочетаются с QProxyStyle. Я постараюсь отказаться от использования таблиц стилей.
Техника Эйлланеска работает со стилем Fusion, поэтому я принял его ответ, но он несовместим с другими стилями.
Подробнее здесь: https://stackoverflow.com/questions/559 ... n-expander