Все пушбутоны меняют цвет в зависимости от выставленной пропертии.
Вопрос в том, можно ли обойтись без такой шизоидной темы, как обработка этим методом каждого из 100500 виджетов на форме? Хотя все виджеты на форме наследуются, изменение динамической пропертии у родительского виджета не наследуется, не раздупляются дочерние виджеты. Есть варианты выкрутиться?
Здравствуйте, XOOIOOX, Вы писали:
XOO>Все пушбутоны меняют цвет в зависимости от выставленной пропертии. XOO>Вопрос в том, можно ли обойтись без такой шизоидной темы, как обработка этим методом каждого из 100500 виджетов на форме? Хотя все виджеты на форме наследуются, изменение динамической пропертии у родительского виджета не наследуется, не раздупляются дочерние виджеты. Есть варианты выкрутиться?
setStyleSheet( styleSheet() );
Здравствуйте, XOOIOOX, Вы писали:
XOO>Не, не работает. XOO>Работает только в случае, как уже говорил выше, если каждый бутон обрабатывать отдельно.
Не, я предложил у главной формы обновить стиль, this->setStyleSheet( this->styleSheet() ), не надо поотдельности каждую кнопку мучить, потом вроде надо update вызвать и все.
Здравствуйте, Igore, Вы писали:
I>setStyleSheet( styleSheet() );
Это в целом тоже самое (по результату), что polish/unpolish, только qss заново парсится. Со всеми вытекающими просадками производительности. На сильно кастомизированных интерфейсах у меня дико тормозило.
XOO>... XOO>Вопрос в том, можно ли обойтись без такой шизоидной темы, как обработка этим методом каждого из 100500 виджетов на форме? Хотя все виджеты на форме наследуются, изменение динамической пропертии у родительского виджета не наследуется, не раздупляются дочерние виджеты. Есть варианты выкрутиться?
Если я правильно понял, то стоит копнуть в сторону обработки QDynamicPropertyChangeEvent
Здравствуйте, SaZ, Вы писали:
SaZ>Если я правильно понял, то стоит копнуть в сторону обработки QDynamicPropertyChangeEvent
Дык ивент же не будет рождаться, если пропертия у каждого виджета не изменилась. А она, насколько понимаю, не меняется, не наследуется от родительского. От родительского ивент-то придет при смене, но объектом по ивент-фильтру будет родительский класс и все.
Так же пробовал явно указывать на форме эту пропертию везде, пробовал основному родительскому классу ее задавать до setupUi — толку ноль.
Может она по-умолчанию и не должна наследоваться (что довольно печально), но можно где-то какой-то атрибут крутануть у QCoreApplication?
Здравствуйте, XOOIOOX, Вы писали:
XOO>Дык ивент же не будет рождаться, если пропертия у каждого виджета не изменилась. А она, насколько понимаю, не меняется, не наследуется от родительского. От родительского ивент-то придет при смене, но объектом по ивент-фильтру будет родительский класс и все.
Ммм. Зачем вы виджеты рассматриваете группой? Цепляйте эвент фильтр на каждый виджет, который нужно отслеживать.
XOO>Так же пробовал явно указывать на форме эту пропертию везде, пробовал основному родительскому классу ее задавать до setupUi — толку ноль.
До setupUi смысла нет. Виджеты же именно там конструируются.
XOO>Может она по-умолчанию и не должна наследоваться (что довольно печально), но можно где-то какой-то атрибут крутануть у QCoreApplication?
Как проперти могут наслезоваться? Это невиртуальная функциональность класса QObject.
Здравствуйте, SaZ, Вы писали:
SaZ>Цепляйте эвент фильтр на каждый виджет, который нужно отслеживать.
Имхо, получается шило на мыло и даже хуже по объему дополнительного кода. В изначальной реализации я прописываю максимум одну строку с виджетом в метод, а в этом случае нужно ивент-фильтр на каждый тип виджета вешать.
И опять же, допустим, я буду генерить свой особый кастомный общий ивент на все, который будет обходить весь ивент-луп и контролить его присутствие во всех виджетах — где заканчивать его обработку? Дойдет ли он до всех виджетов?
SaZ>До setupUi смысла нет.
Да по-всякому пробовал и до и после.
SaZ>Как проперти могут наслезоваться?
Имеется в виду "наследование" изменения этой пропертии хотя бы. Саму пропертию можно задать на форме, она останется у объектов, а вот ее изменение приходится делать у каждого объекта, как теперь понимаю, без вариантов.
Здравствуйте, XOOIOOX, Вы писали:
XOO>Имхо, получается шило на мыло и даже хуже по объему дополнительного кода. В изначальной реализации я прописываю максимум одну строку с виджетом в метод, а в этом случае нужно ивент-фильтр на каждый тип виджета вешать.
Циклы в помощь. Я думаю не стоит особо заморачиваться между 1-й строкой кода и тремя.
auto buttons = rootWidget->findChildren<QPushButton *>();
for ( const auto& button : buttons )
button->installEventFilter( myFilter );
XOO>И опять же, допустим, я буду генерить свой особый кастомный общий ивент на все, который будет обходить весь ивент-луп и контролить его присутствие во всех виджетах — где заканчивать его обработку? Дойдет ли он до всех виджетов?
У вас в обработчике эвента будет и QObject *, который можно qobject_cast<QPushButton *>( obj );. Ничего заканчивать не нужно. Но если уж хочется красиво, то можно такой вот паттерн заюзать, чтобы дёргать обновление не сильно часто:
QTimer t;
t.setSingleShot( true );
t.setTimeout( 0 ); // Возможно, надо чуть больше нуля
connect( &t, &QTimer::timeout, widget, [&](){ widget->polish(); widget->unpolish(); } );
MyHandler::eventFilter(...)
{
//...case QDynamicPropertyChangeEvent:
t.start();
break;
//...
}
XOO>Имеется в виду "наследование" изменения этой пропертии хотя бы. Саму пропертию можно задать на форме, она останется у объектов, а вот ее изменение приходится делать у каждого объекта, как теперь понимаю, без вариантов.
Я так понимаю, вам хочется селектор вида QPushPutton < MyMainWidget[style=1] — все кнопки на виджете, у которого проперти выставлена в 1. Такого не пробовал, ничего не скажу. Если заработает — то не будет никаких заморочек.
И да, сначала polish, потом unpolish. У вас наоборот было.
Опаньки, про такую "рефлексию" я не знал. То, что нужно. Спасибо!
SaZ>Я так понимаю, вам хочется селектор вида QPushPutton < MyMainWidget[style=1] — все кнопки на виджете, у которого проперти выставлена в 1.
Не, это уже лишнее. Атрибут задан извне, просто при его смене меняю пропертии везде.
SaZ>У вас наоборот было.
Действительно. Спасибо!
UPD:
Отлично получилось. Именно так, как хотел. Красота: