Russian Qt Forum
Ноябрь 22, 2024, 12:15 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Как добавить pressed к QFrame?  (Прочитано 14690 раз)
Syveren
Гость
« : Октябрь 09, 2012, 09:33 »

Есть виджет наследованный от QFrame. Как сделать так, чтобы при нажатии на него мышкой сменился его цвет? (через QSS)
   QString styleSheet =
            "QFrame#myFrame{color: #333538;"
            "background-color: blue; }"
            "QFrame#myFrame:pressed"
             "{background-color:red;}";
 Сделал так, но при нажатии мышкой цвет не меняется Непонимающий
« Последнее редактирование: Октябрь 09, 2012, 10:00 от Syveren » Записан
Bepec
Гость
« Ответ #1 : Октябрь 09, 2012, 10:19 »

А у QFrame есть свойство pressed?
Записан
Syveren
Гость
« Ответ #2 : Октябрь 09, 2012, 10:26 »

Кажеться я догадываюсь, что вы имеете ввиду. Своего свойсва нету. Eсли добавить  myFrame->setProperty("pressed",false); и при событии mousePressed/Release выставлять в myFrame->setProperty("pressed",true/false); Всё равно не работает.
Записан
Syveren
Гость
« Ответ #3 : Октябрь 09, 2012, 10:30 »

А если выставить в конструкторе myFrame->setProperty("pressed",true); то он станет красным. Но при изменеии состояния он не обновляеться
Записан
mutineer
Гость
« Ответ #4 : Октябрь 09, 2012, 10:33 »

Попробуй добавить его через Q_PROPERTY и дать свойству сигнал об изменении
Записан
Syveren
Гость
« Ответ #5 : Октябрь 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 изменился или же это побочное действие?
Записан
mutineer
Гость
« Ответ #6 : Октябрь 09, 2012, 11:23 »

это только побочное действие. Что значит "пришлось переопределять QFrame"? Ты ведь и так уже от него отнаследовался
Записан
Syveren
Гость
« Ответ #7 : Октябрь 09, 2012, 11:27 »

Нет, "myFrame" в моем случае одно из полей составного виджета
class HideOptionWidget : public QWidget
{
        QFrame * header;// (myFrame);
        QFrame * base;
        ...
}
Записан
mutineer
Гость
« Ответ #8 : Октябрь 09, 2012, 11:34 »

Есть виджет наследованный от QFrame.

хм... ну ладно...
Записан
Syveren
Гость
« Ответ #9 : Октябрь 09, 2012, 11:50 »

 
Цитировать
Есть виджет наследованный от QFrame.

хм... ну ладно...
Извеняюсь, не так выразился. Уже глючить начинает...)

а если в виджет HideOptionWidget добавить свойство 
Q_PROPERTY(bool headerPressed READ getHeaderPressed WRITE setHeaderPressed NOTIFY headerPressedChanged)?
Можно ли так составить syleSheet, чтобы header получал этот сигнал?
Записан
Bepec
Гость
« Ответ #10 : Октябрь 09, 2012, 14:12 »

StyleSheet разрисовывает. Сигналы он не связывает.

Занялся я вашим исследованием.

В результате вывод - динамическое свойство можно использовать с большим но.

Есть селектор по свойствам виджета. Допустим я добавил свойство Q_PROPERTY(bool clicked READ clicked WRITE clicked )

Добавил такой вот StyleSheet
Код:
*[clicked="true"] { background-color: yellow }
*[clicked="false"] { background-color: red }

Но работать сия конструкция будет только если каждый раз, при изменении clicked вызывать
Код:
setStyleSheet(styleSheet());

Хоть это и работает, но черезпопно. Проще дописать необходимый функционал в ваш фрейм.
Записан
mutineer
Гость
« Ответ #11 : Октябрь 09, 2012, 14:21 »

Есть селектор по свойствам виджета. Допустим я добавил свойство Q_PROPERTY(bool clicked READ clicked WRITE clicked )

А если приписать к свойству сигнал об его изменении?
Записан
Bepec
Гость
« Ответ #12 : Октябрь 09, 2012, 14:24 »

Если приписать, то можно к нему коннектиться и наслаждаться в другом классе, но...

Но я не нашёл сигнала чтобы оповестить StyleSheet об перерасчёте цвета. К сожалению.
Записан
mutineer
Гость
« Ответ #13 : Октябрь 09, 2012, 14:25 »

Если приписать, то можно к нему коннектиться и наслаждаться в другом классе, но...

Но я не нашёл сигнала чтобы оповестить StyleSheet об перерасчёте цвета. К сожалению.

То есть StyleSheet сам на объявленный сигнал не подпишется? Хм, мне казалось что должен подписаться
Записан
Bepec
Гость
« Ответ #14 : Октябрь 09, 2012, 14:27 »

Счас налью и проверю Улыбающийся

update: нифига. Только при перерасчёте (установке стайлшита) меняется :/

update 2: порылся - ещё нокии выставляли это как баг, но они отказались от его исправления, ибо разрабатывали QML (цитат с енглиш).

update 3: Имеется вроде менее затратный способ - вызов конструкции
Код:
style()->unpolish(this);
style()->polish(this);

Что заставляет пересчитать styleSheet только для этого виджета.
« Последнее редактирование: Октябрь 09, 2012, 14:46 от Bepec » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 21.