Russian Qt Forum
Апреля 27, 2025, 12:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Изменение размеров виджетов (шрифта) при изменении размера окна  (Прочитано 17283 раз)
hunter1
Гость
« : Марта 03, 2013, 13:56 »

Здравствуйте, не отправляйте меня сразу учиться пользоваться поиском по форуму, вопросы с такой формулировкой задавались и раньше. Обычно проблема была с банальным не умением пользоваться QGridLayout и QBoxLayout, но мой вопрос в другом.

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


Рисунок 1:



Рисунок 2:



Рисунок 3 (не очень красиво нарисовал, но смысл понятен):



Код:
Код:
#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();
}
« Последнее редактирование: Марта 03, 2013, 13:58 от hunter1 » Записан
VPS
Гость
« Ответ #1 : Марта 03, 2013, 14:25 »

Для того, чтобы кнопка занимала всю ячейку - смотрите в сторону sizePolicy (по умолчанию, вертикальная политика - Fixed).
А вот для изменения размера шрифта, можно наследоваться от класса QPushButton и переопределять метод resizeEvent...
Записан
hunter1
Гость
« Ответ #2 : Марта 08, 2013, 01:23 »

Да, размеры кнопки можно менять настроив sizePolicy. Настроил одну кнопку например:
Код:
btn1->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Expanding);



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

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

Я хотел попробовать запихнуть все кнопки в сцену, а сцену трансформировать. Мне сначала показалось хорошей идеей, но потом отказался. Если кнопка была небольшая, а потом ее растянуть в сцене, то выйдет "пиксельная" кнопка, точно также как у меня вышло в моем первом посте (рисунок 3). Надеюсь вы поняли о чем я - сравните рисунок 3 в моем первом сообщение и рисунок который я приложил чуть выше в этом сообщение. На рисунке 3, ярко выражены границы из растянутых пикселей (так как я растянул форму в паинте), а на рисунке чуть выше, где qt сам увеличил размеры кнопки, границы мягкие.  Подмигивающий
« Последнее редактирование: Марта 08, 2013, 01:26 от hunter1 » Записан
ConConovaloff
Гость
« Ответ #3 : Марта 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 и изменять размер шрифта.
« Последнее редактирование: Марта 08, 2013, 03:48 от ConConovaloff » Записан
hunter1
Гость
« Ответ #4 : Марта 08, 2013, 20:14 »

ConConovaloff, нужно именно для динамического изменения. Большое спасибо! Я не знал про существование setPixelSize, не разбирал код на который кидал ссылку, но оно и там ключевое. Самое удобное, что если шрифт не будет влезать по ширине (это возможно если растягивать окно только по вертикали), то ширина объекта тоже будет увеличиваться.  Улыбающийся
Записан
hunter1
Гость
« Ответ #5 : Марта 09, 2013, 02:10 »

Все отлично работает, но у меня все же есть вопросик Веселый

Почему не выходит задать текст кнопки при ее создании, вылетает ошибка. Не хочет MyPushButton иметь в себе аргумент (как я показал ниже), задать текст можно только через setText, а вот так нет:
Код:
MyPushButton* testButton = new MyPushButton ([b]"Текст"[/b]);
Записан
Figaro
Гость
« Ответ #6 : Марта 09, 2013, 05:25 »

У MyPushButton отсутствует такой конструктор...
Записан
hunter1
Гость
« Ответ #7 : Марта 09, 2013, 11:00 »

Так вроде же MyPushButton наследовался от QPushButton, где такая возможность имелась. Куда она исчезла?  Улыбающийся
Записан
Figaro
Гость
« Ответ #8 : Марта 09, 2013, 13:00 »

Не помню точно раздел стандарта плюсов, но пропиши конструктор:

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

с вызовом
Код:
QPushButton ( const QString & text, QWidget * parent = 0 )
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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