Russian Qt Forum

Qt => Вопросы новичков => Тема начата: hunter1 от Марта 03, 2013, 13:56



Название: Изменение размеров виджетов (шрифта) при изменении размера окна
Отправлено: hunter1 от Марта 03, 2013, 13:56
Здравствуйте, не отправляйте меня сразу учиться пользоваться поиском по форуму, вопросы с такой формулировкой задавались и раньше. Обычно проблема была с банальным не умением пользоваться QGridLayout и QBoxLayout, но мой вопрос в другом.

У меня есть окно (рисунок 1), если его начать растягивать, то виджеты (а именно кнопки) изменяют свои размеры только по ширине (рисунок 2). А я хочу, чтобы менялась и высота виджетов и текст в них, нафотошопил то, что хотелось бы получить (рисунок 3).


Рисунок 1:
(http://s53.radikal.ru/i140/1303/1e/26fbae2b88c2.png) (http://www.radikal.ru)


Рисунок 2:
(http://s017.radikal.ru/i407/1303/bd/5fbfcd17bf27.png) (http://www.radikal.ru)


Рисунок 3 (не очень красиво нарисовал, но смысл понятен):
(http://s58.radikal.ru/i161/1303/27/08647b956952.png) (http://www.radikal.ru)


Код:
Код:
#include <QApplication>
#include <QtWidgets>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget mywindow;

    QPushButton *btn1 = new QPushButton("1");
    QPushButton *btn2 = new QPushButton("2");
    QPushButton *btn3 = new QPushButton("3");
    QPushButton *btn4 = new QPushButton("4");

    QGridLayout *mylayout = new QGridLayout;
    mylayout->addWidget(btn1,0,0);
    mylayout->addWidget(btn2,0,1);
    mylayout->addWidget(btn3,1,0);
    mylayout->addWidget(btn4,1,1);

    mywindow.setLayout(mylayout);

    mywindow.show();
   
    return a.exec();
}


Название: Re: Изменение размеров виджетов (шрифта) при изменении размера окна
Отправлено: VPS от Марта 03, 2013, 14:25
Для того, чтобы кнопка занимала всю ячейку - смотрите в сторону sizePolicy (по умолчанию, вертикальная политика - Fixed).
А вот для изменения размера шрифта, можно наследоваться от класса QPushButton и переопределять метод resizeEvent...


Название: Re: Изменение размеров виджетов (шрифта) при изменении размера окна
Отправлено: hunter1 от Марта 08, 2013, 01:23
Да, размеры кнопки можно менять настроив sizePolicy. Настроил одну кнопку например:
Код:
btn1->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Expanding);
(http://i051.radikal.ru/1303/de/ba55da41b699t.jpg) (http://radikal.ru/F/i051.radikal.ru/1303/de/ba55da41b699.png.html)


Но как сделать так, чтобы и шрифт увеличивался с увеличением кнопки еще не нашел  :-[

В интернетах предлагают изменять шрифт программно, насколько увеличился объект, на столько увеличить и размер шрифта в нем. Например - http://stackoverflow.com/questions/8796380/automatically-resizing-label-text-in-qt-strange-behaviour. Еще не проверял.

Я хотел попробовать запихнуть все кнопки в сцену, а сцену трансформировать. Мне сначала показалось хорошей идеей, но потом отказался. Если кнопка была небольшая, а потом ее растянуть в сцене, то выйдет "пиксельная" кнопка, точно также как у меня вышло в моем первом посте (рисунок 3). Надеюсь вы поняли о чем я - сравните рисунок 3 в моем первом сообщение и рисунок который я приложил чуть выше в этом сообщение. На рисунке 3, ярко выражены границы из растянутых пикселей (так как я растянул форму в паинте), а на рисунке чуть выше, где qt сам увеличил размеры кнопки, границы мягкие.  ;)


Название: Re: Изменение размеров виджетов (шрифта) при изменении размера окна
Отправлено: ConConovaloff от Марта 08, 2013, 02:56
Добрый день.

2 стандартных способа задать размер шрифта для QPushButton:

1) создать QFont, указать ему параметры (размер), и подставлять в QPushButton->setFont()

Код
C++ (Qt)
 
   QFont fontForButton;
   fontForButton.setPixelSize(300);
 
   QPushButton* testButton = new QPushButton("1");
   testButton->setFont(fontForButton);
 


2) QSS
Код
C++ (Qt)
   QPushButton* testButton = new QPushButton("1");
   app.setStyleSheet("QPushButton { font: bold 400px;}");
   testButton->show();
 

В этом случае, вы получаете красивый, плавный, большой шрифт.
Если вы желаете задавать шрифт динамически при изменение размера окна, то стандартный способ, это переопределить событие "resizeEvent":

Код
C++ (Qt)
#include <QtCore>
#include <QtGui>
 
class MyPushButton : public QPushButton{
   Q_OBJECT
public:
   QFont font;
 
   MyPushButton(QPushButton* parent = 0) :
       QPushButton(parent)
   {
       setFont(font);
       setText("1");
   }
 
   void resizeEvent(QResizeEvent *event){
       font.setPixelSize(this->size().height() / 2);
       setFont(font);
   }
};
 
int main(int argc, char** argv){
   QApplication a(argc, argv);
 
   MyPushButton* testButton = new MyPushButton;
   testButton->show();
 
   return  a.exec();
}
 

В этом случае, когда вы будете менять размер окна -> будет вызываться функция resizeEvent и изменять размер шрифта.


Название: Re: Изменение размеров виджетов (шрифта) при изменении размера окна
Отправлено: hunter1 от Марта 08, 2013, 20:14
ConConovaloff, нужно именно для динамического изменения. Большое спасибо! Я не знал про существование setPixelSize, не разбирал код на который кидал ссылку, но оно и там ключевое. Самое удобное, что если шрифт не будет влезать по ширине (это возможно если растягивать окно только по вертикали), то ширина объекта тоже будет увеличиваться.  :)


Название: Re: Изменение размеров виджетов (шрифта) при изменении размера окна
Отправлено: hunter1 от Марта 09, 2013, 02:10
Все отлично работает, но у меня все же есть вопросик :D

Почему не выходит задать текст кнопки при ее создании, вылетает ошибка. Не хочет MyPushButton иметь в себе аргумент (как я показал ниже), задать текст можно только через setText, а вот так нет:
Код:
MyPushButton* testButton = new MyPushButton ([b]"Текст"[/b]);


Название: Re: Изменение размеров виджетов (шрифта) при изменении размера окна
Отправлено: Figaro от Марта 09, 2013, 05:25
У MyPushButton отсутствует такой конструктор...


Название: Re: Изменение размеров виджетов (шрифта) при изменении размера окна
Отправлено: hunter1 от Марта 09, 2013, 11:00
Так вроде же MyPushButton наследовался от QPushButton, где такая возможность имелась. Куда она исчезла?  :)


Название: Re: Изменение размеров виджетов (шрифта) при изменении размера окна
Отправлено: Figaro от Марта 09, 2013, 13:00
Не помню точно раздел стандарта плюсов, но пропиши конструктор:

Код:
MyPushButton( const QString & text, QWidget * parent = 0 )

с вызовом
Код:
QPushButton ( const QString & text, QWidget * parent = 0 )