Название: Как добавить pressed к QFrame? Отправлено: Syveren от Октябрь 09, 2012, 09:33 Есть виджет наследованный от QFrame. Как сделать так, чтобы при нажатии на него мышкой сменился его цвет? (через QSS)
QString styleSheet = "QFrame#myFrame{color: #333538;" "background-color: blue; }" "QFrame#myFrame:pressed" "{background-color:red;}"; Сделал так, но при нажатии мышкой цвет не меняется ??? Название: Re: Как добавить pressed к QFrame? Отправлено: Bepec от Октябрь 09, 2012, 10:19 А у QFrame есть свойство pressed?
Название: Re: Как добавить pressed к QFrame? Отправлено: Syveren от Октябрь 09, 2012, 10:26 Кажеться я догадываюсь, что вы имеете ввиду. Своего свойсва нету. Eсли добавить myFrame->setProperty("pressed",false); и при событии mousePressed/Release выставлять в myFrame->setProperty("pressed",true/false); Всё равно не работает.
Название: Re: Как добавить pressed к QFrame? Отправлено: Syveren от Октябрь 09, 2012, 10:30 А если выставить в конструкторе myFrame->setProperty("pressed",true); то он станет красным. Но при изменеии состояния он не обновляеться
Название: Re: Как добавить pressed к QFrame? Отправлено: mutineer от Октябрь 09, 2012, 10:33 Попробуй добавить его через Q_PROPERTY и дать свойству сигнал об изменении
Название: Re: Как добавить pressed к QFrame? Отправлено: Syveren от Октябрь 09, 2012, 11:09 Цитировать Попробуй добавить его через Q_PROPERTY и дать свойству сигнал об изменении Работает, спасибо, но пришлось переопределять QFrame чтобы добавить Q_PROPERTY(bool headerPressed READ getHeaderPressed WRITE setHeaderPressed NOTIFY headerPressedChanged), что не очень удобно.Сейчас поэкспериментировал с прошлым вариантом (property добавлялся так: myFrame->setProperty("pressed",false)) и заметил, что если после клика мышкой добавить myFrame->style()->polish(myFrame); то все работает и цвет меняеться. Но я не очень-то понял назначение функции. Эта функция существует для сообщению виджету что property изменился или же это побочное действие? Название: Re: Как добавить pressed к QFrame? Отправлено: mutineer от Октябрь 09, 2012, 11:23 это только побочное действие. Что значит "пришлось переопределять QFrame"? Ты ведь и так уже от него отнаследовался
Название: Re: Как добавить pressed к QFrame? Отправлено: Syveren от Октябрь 09, 2012, 11:27 Нет, "myFrame" в моем случае одно из полей составного виджета
class HideOptionWidget : public QWidget { QFrame * header;// (myFrame); QFrame * base; ... } Название: Re: Как добавить pressed к QFrame? Отправлено: mutineer от Октябрь 09, 2012, 11:34 Название: Re: Как добавить pressed к QFrame? Отправлено: Syveren от Октябрь 09, 2012, 11:50 Цитировать Есть виджет наследованный от QFrame. Извеняюсь, не так выразился. Уже глючить начинает...)хм... ну ладно... а если в виджет HideOptionWidget добавить свойство Q_PROPERTY(bool headerPressed READ getHeaderPressed WRITE setHeaderPressed NOTIFY headerPressedChanged)? Можно ли так составить syleSheet, чтобы header получал этот сигнал? Название: Re: Как добавить pressed к QFrame? Отправлено: Bepec от Октябрь 09, 2012, 14:12 StyleSheet разрисовывает. Сигналы он не связывает.
Занялся я вашим исследованием. В результате вывод - динамическое свойство можно использовать с большим но. Есть селектор по свойствам виджета. Допустим я добавил свойство Q_PROPERTY(bool clicked READ clicked WRITE clicked ) Добавил такой вот StyleSheet Код: *[clicked="true"] { background-color: yellow } Но работать сия конструкция будет только если каждый раз, при изменении clicked вызывать Код: setStyleSheet(styleSheet()); Хоть это и работает, но черезпопно. Проще дописать необходимый функционал в ваш фрейм. Название: Re: Как добавить pressed к QFrame? Отправлено: mutineer от Октябрь 09, 2012, 14:21 Есть селектор по свойствам виджета. Допустим я добавил свойство Q_PROPERTY(bool clicked READ clicked WRITE clicked ) А если приписать к свойству сигнал об его изменении? Название: Re: Как добавить pressed к QFrame? Отправлено: Bepec от Октябрь 09, 2012, 14:24 Если приписать, то можно к нему коннектиться и наслаждаться в другом классе, но...
Но я не нашёл сигнала чтобы оповестить StyleSheet об перерасчёте цвета. К сожалению. Название: Re: Как добавить pressed к QFrame? Отправлено: mutineer от Октябрь 09, 2012, 14:25 Если приписать, то можно к нему коннектиться и наслаждаться в другом классе, но... Но я не нашёл сигнала чтобы оповестить StyleSheet об перерасчёте цвета. К сожалению. То есть StyleSheet сам на объявленный сигнал не подпишется? Хм, мне казалось что должен подписаться Название: Re: Как добавить pressed к QFrame? Отправлено: Bepec от Октябрь 09, 2012, 14:27 Счас налью и проверю :)
update: нифига. Только при перерасчёте (установке стайлшита) меняется :/ update 2: порылся - ещё нокии выставляли это как баг, но они отказались от его исправления, ибо разрабатывали QML (цитат с енглиш). update 3: Имеется вроде менее затратный способ - вызов конструкции Код: style()->unpolish(this); Что заставляет пересчитать styleSheet только для этого виджета. Название: Re: Как добавить pressed к QFrame? Отправлено: Syveren от Октябрь 09, 2012, 14:28 На просторах интернета нашёл вот что:
Цитировать If the value of the Qt property changes after the style sheet has been set, you will probably have to force a style sheet recomputation. This can be done by calling Взято отсюда: http://qt-project.org/faq/answer/how_can_my_stylesheet_account_for_custom_propertiesstyle()->unpolish(theWidget); style()->polish(theWidget); Alternatively, you can unset the style sheet and set it again, but this is more expensive than the first solution. Интересно почему: probably Название: Re: Как добавить pressed к QFrame? Отправлено: Syveren от Октябрь 09, 2012, 16:21 Мистика ??? Еще днём по совету выше добавлял в преопределенный виджет Q_PROPERTY
и всё работало (При нажатии виджет становился красным). Сейчас запустил тот же самый код и уже ничего не работает. Код
Название: Re: Как добавить pressed к QFrame? Отправлено: Bepec от Октябрь 09, 2012, 17:46 Ну как бэ можешь перечитать мою сообщеньку в конце 1 страницы, но у тебя все шансы разобраться самому :)
|