Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Автомасштабирование иконок и надписей кнопок


Автор: Usper 21.11.2011, 12:51
Доброго времени суток.
Я новичок в 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);    
}

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

Автор: bsa 21.11.2011, 14:03
Usper, в этом случае, я бы написал свой класс кнопки и рисовал бы текст и картинку того размера, который лучше соответствует ее размеру.

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

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

есть. http://doc.qt.nokia.com/latest/qfontmetrics.html#width

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

Автор: bsa 22.11.2011, 11:32
sizeHint - это рекомендуемый размер элемента. Тебе нужен или rect(), или size().

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

Автор: bsa 22.11.2011, 13:32
Usper, вообще-то, шрифты масштабируются дискретно. Нет?

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

Автор: bsa 22.11.2011, 14:30
Usper, думаю, тебе надо написать свой собственный компонент, который будет делать кучу полностью масштабируемых кнопок. Подозреваю, что штатными средствами Qt это сделать будет затруднительно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)