crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> GSS против property?
Mae Stro
  опции профиля:
сообщение 13.8.2009, 22:01
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 13.8.2009
Пользователь №: 1002

Спасибо сказали: 0 раз(а)




Репутация:   0  


Доброго времени суток.

Вопрос, как настроить Qt так, чтоб смена property таки отображалась стилями GSS?

У меня есть несколько однотипных кнопок на форме (наследники QPushButton). Задумалось мне выделить последнюю нажатую кнопку.

Задал переменную в классе:

QPushButton * bt_selected;            // текущая выбранная кнопка стадии


в эвенте на клик по кнопке прописал (bt - указатель на нажатую кнопку):

    if ( bt_selected )
        bt_selected->setProperty("stage_active", false);    // снимаем "избранность" с кнопки

    ( bt_selected = bt )->setProperty("stage_active", true);


в файле стиля:

QPushButton[stage_active="true"]
{
    border: 1px solid palette(shadow);
}



и... ничего. Проперти меняются, выделение цветом бордюра отсутствует. Только если выставить проперти до первого show() формы - тогда они есть. Смена проперти в рантайме игнорится, стиль кнопок не меняется.

Ок, может быть, Qt не работает с динамическими свойствами? Определил свойство через Q_PROPERTY.


    Q_PROPERTY(bool stage_active READ stage_active WRITE set_stage_active)

    bool active;

public:
    void set_stage_active(bool stage_active) { active = stage_active; }
    int stage_active() const { return active; }


Ведь статику то движок перерисовывает, видно хотя бы по enabled! Реакция - ноль, стили не меняются.

Ок, смодил код нажатия на кнопку:


    if ( bt_selected )
    {
        bt_selected->setProperty("stage_active", false);    // снимаем "избранность" с кнопки
        bt_selected->setStyleSheet(QString("*{}"));
    }

    ( bt_selected = bt )->setProperty("stage_active", true);
    bt_selected->setStyleSheet(QString("*{}"));


то есть тупо присваиваю абстрактный стиль кнопке. ЗАРАБОТАЛО, стили начали меняться. Но ведь это ДЕЙСТВИТЕЛЬНО ТУПОЕ РЕШЕНИЕ.

Как правильно решить вопрос?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 13.8.2009, 22:08
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Я думаю речь все таки о CSS, а не GSS.

Цитата(Mae Stro @ 13.8.2009, 23:01) *
ЗАРАБОТАЛО, стили начали меняться. Но ведь это ДЕЙСТВИТЕЛЬНО ТУПОЕ РЕШЕНИЕ.


Я писал по этому поводу троллям, их официальный ответ был "This is not a bug." и привели мне код, который совершенно не в кассу. Типа я не умею готовить кошек. Может быть есть смысл еще раз напомнить об этом? Создай еще один багрепорт.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Mae Stro
  опции профиля:
сообщение 13.8.2009, 23:20
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 13.8.2009
Пользователь №: 1002

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(SABROG @ 13.8.2009, 23:08) *
Я думаю речь все таки о CSS, а не GSS.


виноват, свой приватный термин опубликовал :) Все-таки CSS больше к HTML идет и в Qt юзается, а эти стили к движку предназначены.

А что за код прислали? Если из доков, то это нуль.

еще вариант - раскапывая setStyleSheet...

так тоже работает... но увы, все ручная сборка

    ( bt_selected = bt )->setProperty("stage_active", true);
    bt_selected->style()->polish(bt);
    bt->update();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 14.8.2009, 6:57
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Мне кажется, что update() - вполне правильное решение.
Правда звать его нужно в коде установки свойства: set_stage_active.
А как иначе движек узнает о том, что свойство изменилось и нужно перерисовать виджет?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 14.8.2009, 8:08
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(Mae Stro @ 14.8.2009, 0:20) *
А что за код прислали?

Цитата
This is not a bug. You should use something like this:

QCheckBox:checked
{
border:1 solid red;
}
QCheckBox
{
border: 1 solid green;
}

instead you are using QLineEdit, which will not apply to QCheckBox.

Best Regards,

--
George Liu, Release Engineer
Nokia, Qt Software


Цитата(Tonal @ 14.8.2009, 7:57) *
Мне кажется, что update() - вполне правильное решение.

Когда я пробовал в последний раз ни update() ни polish() результатов не давали.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Mae Stro
  опции профиля:
сообщение 14.8.2009, 9:38
Сообщение #6


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 13.8.2009
Пользователь №: 1002

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(SABROG @ 14.8.2009, 9:08) *
Цитата(Tonal @ 14.8.2009, 7:57) *
Мне кажется, что update() - вполне правильное решение.

Когда я пробовал в последний раз ни update() ни polish() результатов не давали.


ну, на 4.5.2 этот код работает

    Q_PROPERTY(bool stage_active READ stage_active WRITE set_stage_active)

    bool active;


...

    void set_stage_active(bool stage_active)
    {    active = stage_active;
        style()->polish(this);
        update();
    }
    int stage_active() const { return active; }


Цитата(Tonal @ 14.8.2009, 7:57) *
А как иначе движек узнает о том, что свойство изменилось и нужно перерисовать виджет?


Вообщето установка динамический свойств генерирует QDynamicPropertyChangeEvent
По идее, разработчики должны были туда внести перерисовку по обстоятельствам, с минимальными накладными расходами.

Однако у них там есть что-то, имеющее отношение к шрифтам - и все.

А style()->polish(...) - это примение кувалды, чтоб забить гвоздик.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 12.12.2024, 12:24