Russian Qt Forum

Qt => QSS => Тема начата: Syveren от Октябрь 09, 2012, 09:33



Название: Как добавить 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
Есть виджет наследованный от QFrame.

хм... ну ладно...


Название: 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="false"] { background-color: red }

Но работать сия конструкция будет только если каждый раз, при изменении 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);
style()->polish(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
style()->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.
Взято отсюда: http://qt-project.org/faq/answer/how_can_my_stylesheet_account_for_custom_properties
Интересно почему: probably


Название: Re: Как добавить pressed к QFrame?
Отправлено: Syveren от Октябрь 09, 2012, 16:21
 Мистика ??? Еще днём по совету выше добавлял в преопределенный виджет  Q_PROPERTY  
и всё работало (При нажатии виджет становился красным). Сейчас запустил тот же самый код и уже ничего не работает.
Код
C++ (Qt)
class MyFrame:public QFrame
{
Q_OBJECT
public:
   Q_PROPERTY(bool headerPressed READ getHeaderPressed WRITE setHeaderPressed NOTIFY headerPressedChanged)
 
   MyFrame(QWidget *parent = 0):QFrame(parent){
       setProperty("headerPressed",false);
       setStyleSheet(
                      "MyFrame{"
                      "background-color: blue;}"
                       "MyFrame[headerPressed=true]{"
                      "background-color: red;}");
   }
 
   bool is_pressed;
   bool getHeaderPressed() const{return is_pressed;}
   void setHeaderPressed(bool pressed){ is_pressed=pressed;}
 
   void mouseReleaseEvent(QMouseEvent *){
       setProperty("headerPressed",false);
       emit headerPressedChanged(false);
   }
   void mousePressEvent(QMouseEvent *)
   {
       setProperty("headerPressed",true);
       emit headerPressedChanged(true);
   }
signals:
   void headerPressedChanged(bool);
};


Название: Re: Как добавить pressed к QFrame?
Отправлено: Bepec от Октябрь 09, 2012, 17:46
Ну как бэ можешь перечитать мою сообщеньку в конце 1 страницы, но у тебя все шансы разобраться самому :)