Изменение визуального флажка QGroupBox на расширительPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Изменение визуального флажка QGroupBox на расширитель

Сообщение Anonymous »

Я изменил поведение флажка QGroupBox, чтобы скрыть/показать дочерние элементы группы, эффективно действуя как расширитель. Он работает отлично, но единственная проблема заключается в том, что значок флажка по умолчанию выглядит так, будто он предназначен для включения/отключения группы, а не для ее расширения. Вместо этого я бы хотел заменить его значком в виде расширителя.
Я нашел этот пост, который почти отвечает на мой вопрос (и в конечном итоге мне, возможно, придется использовать это решение): Изменить Изображение флажка 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)
В этом коде, похоже, было сделано что-то подобное. Проблема, с которой я столкнулся, заключается в том, что моя переопределенная функция drawPrimitive() вообще не вызывается для виджетов QGroupBox... но она вызывается для других виджетов с примененным тем же стилем прокси! Глядя на функцию drawComplexControl() в qcommonstyle.cpp, вызывается случай CC_GroupBox

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Изменение визуального флажка QGroupBox на расширитель
    Anonymous » » в форуме Python
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Общий расширитель родительского класса
    Гость » » в форуме JAVA
    0 Ответы
    11 Просмотры
    Последнее сообщение Гость
  • Поставщик расширителей не смог вернуть расширитель
    Anonymous » » в форуме C#
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Изменение значка флажка на галочку во всплывающем меню
    Anonymous » » в форуме Android
    0 Ответы
    36 Просмотры
    Последнее сообщение Anonymous
  • Чтение и изменение флажка внутри WebView2 с помощью кода C#.
    Anonymous » » в форуме C#
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»