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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QPushButton и Изображение  (Прочитано 7831 раз)
Григорий
Гость
« : Апрель 04, 2012, 09:57 »

Уважаемые форумчане, как сделать чтобы кнопка созданная вот таким образом

Код:
btn = new QPushButton(QIcon(":shut.png"),"")

т.е с пустым текстом и неким изображением, могла при растяжении по вертикали и горизонтали тянуть и это изображении без нарушения пропорций (т.е изображение было всегда максимальным внутри рамки кнопки но при этом и сохраняло свои пропорции)

дайте мне направление советом в нужную сторону, что там надо добавить стиль может какой?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Апрель 04, 2012, 10:12 »

Опять ты с этим растягиванием)
Стандартных средств нет.
Можно попробовать перегрузить QPushButton::resizeEvent() и в нём выставить соответствующий размер через setIconSize().
Но нет гарантий, что это будет портабельно, т.к. кнопка очень platform-specific контрол.
Записан

Qt 5.11/4.8.7 (X11/Win)
Григорий
Гость
« Ответ #2 : Апрель 04, 2012, 11:07 »

Опять ты с этим растягиванием)
Стандартных средств нет.
Можно попробовать перегрузить QPushButton::resizeEvent() и в нём выставить соответствующий размер через setIconSize().
Но нет гарантий, что это будет портабельно, т.к. кнопка очень platform-specific контрол.

хорошо делаю свой класс с перегруженым событием

Код:
class Button : public QPushButton {
 public:
  Button(QIcon icon,QString str) : QPushButton(icon,str) {}
 protected:
  virtual void resizeEvent(QResizeEvent* event) {
//   setIconSize(event->size());
  }
};

а вот что в самом евенте писать ?, если ставить что я закоментил то у меня получается цикл изменение размера иконы порождает новый ресайз эвент и кнопка тянется до бесконечности((...
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Апрель 04, 2012, 11:48 »

Не ну так же нельзя...
Ведь кнопка состоит помимо иконки как минимум ещё и из рамки и отступов.
Выставляя размер иконки в текущий размер кнопки размер кнопки будет пересчитан и получится рекурсия.
Поэтому размер иконки нужно рассчитывать с учётом рамки и отступов:
Код
C++ (Qt)
void resizeEvent(QResizeEvent* event)
{
QStyleOptionButton opt;
initStyleOption( &opt );
 
int bm = style()->pixelMetric( QStyle::PM_ButtonMargin, &opt, this );
int fw = style()->pixelMetric( QStyle::PM_DefaultFrameWidth, &opt, this ) * 2;
 
setIconSize( QSize( width() - ( bm + fw ), height()  - ( bm + fw ) ) );
}
 
Ежели всё-равно будет рекурсия, то придётся вставить так называемые guard-ы.
Записан

Qt 5.11/4.8.7 (X11/Win)
andrew.k
Гость
« Ответ #4 : Апрель 05, 2012, 00:22 »

Ежели всё-равно будет рекурсия, то придётся вставить так называемые guard-ы.
А кто такие? Расскажешь?
Записан
Bepec
Гость
« Ответ #5 : Апрель 05, 2012, 07:03 »

Я думаю что это аналог булевских переменных, просто более красиво оформленных.

Проще выражаясь - запрет на перерасчёт размеров в момент изменения размеров картинки.
Записан
andrew.k
Гость
« Ответ #6 : Апрель 05, 2012, 10:51 »

Я думаю что это аналог булевских переменных, просто более красиво оформленных.

Проще выражаясь - запрет на перерасчёт размеров в момент изменения размеров картинки.
Гадать я тоже могу. Я спросил, чтобы знать достоверно.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Апрель 05, 2012, 11:41 »

А кто такие? Расскажешь?

Проще выражаясь - запрет на перерасчёт размеров в момент изменения размеров картинки.
Именно так)

Код
C++ (Qt)
void resizeEvent(QResizeEvent* event)
{
if( in_resize )
         return;
in_resize = true;
...
in_resize = false;
}
 
« Последнее редактирование: Апрель 05, 2012, 11:43 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Bepec
Гость
« Ответ #8 : Апрель 05, 2012, 12:01 »

Профит Подмигивающий
Записан
andrew.k
Гость
« Ответ #9 : Апрель 05, 2012, 12:12 »

А кто такие? Расскажешь?

Проще выражаясь - запрет на перерасчёт размеров в момент изменения размеров картинки.
Именно так)

Код
C++ (Qt)
void resizeEvent(QResizeEvent* event)
{
if( in_resize )
         return;
in_resize = true;
...
in_resize = false;
}
 
PFF тогда не интересно)
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #10 : Апрель 05, 2012, 12:14 »

PFF тогда не интересно)
Ну вот, знал бы, не писал бы)
Записан

Qt 5.11/4.8.7 (X11/Win)
Bepec
Гость
« Ответ #11 : Апрель 05, 2012, 12:24 »

А все гварды на этом стоят Подмигивающий Пусть и не интересно, зато функционально Подмигивающий
Записан
andrew.k
Гость
« Ответ #12 : Апрель 05, 2012, 13:06 »

PFF тогда не интересно)
Ну вот, знал бы, не писал бы)
Не написал бы, я бы не узнал бы)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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