Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Автомасштабирование иконок и надписей кнопок 
:(
    Опции темы
Usper
Дата 21.11.2011, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 13.4.2007

Репутация: нет
Всего: 15



Доброго времени суток.
Я новичок в Qt и столкнулся с такой проблемой: требуется приложение с автомасштабированием кнопок на форме (приложение представляет собой по сути форму, на которой n-кнопок, полностью заполняющих пространство формы). Кнопки надо масштабировать не только по ширине, но и по высоте. С размером самих кнопок проблем нет, но вот иконки и надписи на кнопках остаются первоначального размера. Гугление говорит, что надо использовать событие resizeEvent. Я в обработчик события написал что-то вроде:
Код

...
class TMegaStarter : public QWidget
{
    Q_OBJECT
public:
    explicit TMegaStarter(QWidget * parent = 0);
    QGridLayout * mLayout;
    void resizeEvent (QResizeEvent * event);
    QPushButton * button;
signals:

public slots:

};
...
void TMegaStarter::resizeEvent (QResizeEvent * event)
{
    QSize icSize;
    int icHeight;
    icHeight = button->height() - 20; // 20 - волшебное число, определяющее насколько иконка меньше высоты кнопки
    icSize.setHeight(icHeight);
    icSize.setWidth(icHeight);
    QFont font;
    font = button->font();
    font.setPixelSize(icHeight);
    button->setIconSize(icSize);
    button->setFont(font);    
}

Однако результат работы обработчика крайне нестабилен. То шрифт слишком мелкий, то увеличение размера шрифта приводит к автоматическому увеличению размеров кнопки, что приводит к новому увеличению размера шрифта и так до бесконечности, пока программа не упадёт. Как грамотно сделать автомасштабирование?


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
bsa
Дата 21.11.2011, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Usper, в этом случае, я бы написал свой класс кнопки и рисовал бы текст и картинку того размера, который лучше соответствует ее размеру.
PM   Вверх
Usper
Дата 22.11.2011, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 13.4.2007

Репутация: нет
Всего: 15



Хотелось бы конкретики  smile Я же и пытаюсь делать что-то подобное, но не в классе кнопки, а в классе родительского виджета так как кнопок у меня несколько и если каждая будет сама подбирать размер шрифта наверняка этот самый размер на разных кнопках будет разный.
В частности, есть в Qt что-нибудь типа билдеровского widgetName->Canvas->TextWidth("MegaText")?


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
borisbn
Дата 22.11.2011, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(Usper @  22.11.2011,  07:38 Найти цитируемый пост)
В частности, есть в Qt что-нибудь типа билдеровского widgetName->Canvas->TextWidth("MegaText")?

есть. QFontMetrics::width( QString )


Это сообщение отредактировал(а) borisbn - 22.11.2011, 09:05


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Usper
Дата 22.11.2011, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 13.4.2007

Репутация: нет
Всего: 15



То что надо, спасибо! 
А как теперь узнать сколько именно мне выделено места для надписи и иконок? То есть нужно учесть толщину границ кнопок и подобные вещи. Например я сделал простенкое приложение из одной кнопки. Для этой кнопки button->sizeHint().width() равен 75, а ширина текста при этом (button->fontMetrics().width(button->text())) равна 62. Иконка на кнопке отусутствует.


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
bsa
Дата 22.11.2011, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



sizeHint - это рекомендуемый размер элемента. Тебе нужен или rect(), или size().
PM   Вверх
Usper
Дата 22.11.2011, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 13.4.2007

Репутация: нет
Всего: 15



О, уже ближе smile button->width() равен 154, а button->fontMetrics().width(button->text()) равен 146. Куда делись ещё 8 пикселей?


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
bsa
Дата 22.11.2011, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Usper, вообще-то, шрифты масштабируются дискретно. Нет?
PM   Вверх
Usper
Дата 22.11.2011, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 13.4.2007

Репутация: нет
Всего: 15



Но и кнопка подгоняется под размер надписи на ней. Это не я её сделал такой ширины, а она сама. Меняю размер шрифта надписи, размер кнопки тоже увеличивается таким образом, что между надписью и границами кнопки есть отступ по 4 пикселя. Думаю эти 4 пикселя где-то задаются, но как называется этот параметр я не знаю :(. Можно конечно принять это волшебное число за аксиому, но вдруг на другой системе этот параметр будет равен не 4 пикселя, а больше?


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
bsa
Дата 22.11.2011, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Usper, думаю, тебе надо написать свой собственный компонент, который будет делать кучу полностью масштабируемых кнопок. Подозреваю, что штатными средствами Qt это сделать будет затруднительно.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0913 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.