Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Vladimir от Март 21, 2014, 12:57



Название: [РЕШЕНО] Изменение цвета иконки
Отправлено: Vladimir от Март 21, 2014, 12:57
Доброго дня! Хочется чтобы при залипании кнопки иконка была активной, а в отщелкнутом состоянии становилось Disabled. Делаю так:

Код:
btnScaleUp = new QPushButton(this);
btnScaleUp->setCheckable(true);
QIcon iconScaleUp;
iconScaleUp.addPixmap(QPixmap(":/img/zoomin.png"),QIcon::Disabled,QIcon::Off);
iconScaleUp.addPixmap(QPixmap(":/img/zoomin.png"),QIcon::Active,  QIcon::On);
btnScaleUp->setIcon(iconScaleUp);

иконка отображается, но вообще не меняется  ??? что не так?


Название: Re: Изменение цвета иконки
Отправлено: Bepec от Март 21, 2014, 14:18
На мой взгляд вы просто устанавливаете одну и ту же pixmap на 2 разных состояния, не?


Название: Re: Изменение цвета иконки
Отправлено: Vladimir от Март 21, 2014, 14:32
На мой взгляд вы просто устанавливаете одну и ту же pixmap на 2 разных состояния, не?

ммм.. так а нужно иметь 2 картинки? я хотел чтобы Qt сам поменял картинку (сделал ее серой), для неактивного состояния, а для активного снова отобразил как есть. в этом же и смысл..  или я что-то не правильно понимаю.. как это реализовать?


Название: Re: Изменение цвета иконки
Отправлено: Bepec от Март 21, 2014, 16:21
Иконка сама реализует затемнение. А вы устанавливаете вместо значений по умолчанию картинки.

Псевдокод:
Код:
QIcon tempIcon (QPixmap("ГдетоКакаятоКартинка"));
QIcon iconScaleUp;
iconScaleUp.addPixmap(tempIcon.pixmap(40,40, QIcon::Disabled,QIcon::Off);
iconScaleUp.addPixmap(tempIcon.pixmap(40,40, QIcon::Active,  QIcon::On);
btnScaleUp->setIcon(iconScaleUp);
Если в 2 словах - по идее вы должны запихнуть пиксмап в иконку и вытащить оттуда 2 его состояния, что и делает функция pixmap. Далее установить их на нужные роли. Но это вы уже сами доделывайте и проверяйте.


Название: Re: Изменение цвета иконки
Отправлено: Igors от Март 21, 2014, 18:02
Сделайте 1 addPixmap без 3-го параметра и посмотрите


Название: Re: Изменение цвета иконки
Отправлено: Vladimir от Март 23, 2014, 14:49
Спасибо за разъяснения..
Код:
QIcon tmpIcon;
    if(state)
    {
        tmpIcon.addPixmap(aws->gui->mToolBar->iconInd_M->pixmap(40,40, QIcon::Active));
        aws->gui->mToolBar->btnTypeInd_M->setIcon(tmpIcon);
    }
    else
    {
        tmpIcon.addPixmap(aws->gui->mToolBar->iconInd_M->pixmap(40,40, QIcon::Disabled));
        aws->gui->mToolBar->btnTypeInd_M->setIcon(tmpIcon);
    }

так работает (в слоте обрабоки нажатия на кнопку меняю состояние с Active на Disabled), так этот механизм и должен использоваться? или при инициализации кнопки можно задать состояния иконки при нажатой/отжатой кнопки, а не делать это в обработке? на что влияют флаги QIcon::Off и QIcon::On, не на состояние кнопки? не могу понять..
Потому что, если при инициализации писать
Код:
btnScaleUp = new QPushButton(this);
btnScaleUp->setCheckable(true);
QIcon tmpIcon;
QIcon iconBtnScaleUp(QPixmap(":/img/zoomin.png"));
tmpIcon.addPixmap(iconBtnScaleUp.pixmap(40,40, QIcon::Active,  QIcon::On));
tmpIcon.addPixmap(iconBtnScaleUp.pixmap(40,40, QIcon::Disabled,QIcon::Off));
btnScaleUp->setIcon(tmpIcon);

btnScaleUp->setIconSize(QSize(32,32));
btnScaleUp->setMinimumSize(sizeBtn);
btnScaleUp->setMaximumSize(sizeBtn);
addWidget(btnScaleUp);
то иконка всегда Disabled и состояние ее не меняется..


Название: Re: Изменение цвета иконки
Отправлено: Igors от Март 23, 2014, 15:35
так работает (в слоте обрабоки нажатия на кнопку меняю состояние с Active на Disabled), так этот механизм и должен использоваться? или при инициализации кнопки можно задать состояния иконки при нажатой/отжатой кнопки, а не делать это в обработке? на что влияют флаги QIcon::Off и QIcon::On, не на состояние кнопки? не могу понять..
Я это понимаю так: QIcon задуман чтобы автоматом/пулеметом рисовать вариации одной и той же пиксмапы. Поэтому достаточно сделать 1 addPixmap и она сама разберется. Ну вернее стиль, производство вариантов на нем. Однако может случиться что автомат не устраивает - (напр у меня selected слишком бледный) - тогда есть возможность задать явно. Делая addPix,ap(...QIcon::Off) Вы указываете что Off иконка должна быть точно той пиксмапой что Вы назначили. Ну а поскольку Вы назначили одинаковые - они и будут