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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Изменение размеров шрифта внутри QWidget во время работы  (Прочитано 8655 раз)
vulko
Гость
« : Октябрь 16, 2014, 15:57 »

Есть QWidget, в котором ещё много виджетов и лейаутов.

Нужно менять размер текста внутри него и child виджетов.

Поскольку изначально стили грузятся из CSS, в рантайме делаю:

settingsWidget->setStyleSheet("font-size: " + fontSize + "pt;");


Есть
Код:
class SettingsWidget : public QDialog

SettingsWidget::SettingsWidget(QWidget *parent)
    : QDialog(parent) {
    //setFixedSize(500, 500);
    setWindowFlags(Qt::X11BypassWindowManagerHint | Qt::WindowStaysOnTopHint);
    setAttribute(Qt::WA_TranslucentBackground);
    setContentsMargins(0, 0, 0, 0);
    init();
}

void SettingsWidget::init() {
    tabWidget = new QTabWidget(this);
    connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(onTabChanged(int)));

...

    QBoxLayout *mainLayout = new QBoxLayout(QBoxLayout::TopToBottom, this);
    mainLayout->addWidget(tabWidget, 0, Qt::AlignCenter);
    setLayout(mainLayout);

    //refreshWidgetForCurrentUser();
}

При увеличении размеров текста все отлично увеличивается, а вот при уменьшении уменьшается только QTabWidget, а сам SettingsWidget не хочет уменьшаться...

Вопроса два:
почему так происходит?
как это исправить?
Записан
vulko
Гость
« Ответ #1 : Октябрь 31, 2014, 15:26 »

Никто не сталкивался с таким?
Записан
Hrundel
Гость
« Ответ #2 : Ноябрь 01, 2014, 14:20 »

Лично я нигде в твоем коде не увидел, что он делает для того, чтобы QDialog уменьшился.
Записан
vulko
Гость
« Ответ #3 : Ноябрь 05, 2014, 09:28 »

Лично я нигде в твоем коде не увидел, что он делает для того, чтобы QDialog уменьшился.

Да ничего не делает. Просто есть виджет у которого не задается размер.

И есть вызов:
Код:
    settingsWidget->setStyleSheet("font-size: " + QString::number(CfgManager::Instance()->getSizeSettings()->getWidgetFontSize()) + "pt;");
при изменении размера шрифта.

Увеличиваю размер шрифта, виджет растягивается. Уменьшаю - виджет остается таким же.
Что сделать чтобы виджет всегда принимал минимально нужный размер?
Записан
Hrundel
Гость
« Ответ #4 : Ноябрь 05, 2014, 19:30 »

Дело в том, что у тебя есть QBoxLayout, который автоматически расширяет QDialog.
Кода QLabel уменьшает свой размер (что навряд-ли. Полагаю, что размер остается после расширения такой же. Просто букв становиться меньше.) , все остальное не уменьшает. Значит, нужно все элементы GUI приводить снова к размеру QLabel.
Принудительно - setGeometry().
Либо разобраться с лэйаутом, и привязать размер окна к размеру лейаута.
« Последнее редактирование: Ноябрь 05, 2014, 19:32 от Hrundel » Записан
vulko
Гость
« Ответ #5 : Ноябрь 06, 2014, 10:23 »

Дело в том, что у тебя есть QBoxLayout, который автоматически расширяет QDialog.
Кода QLabel уменьшает свой размер (что навряд-ли. Полагаю, что размер остается после расширения такой же. Просто букв становиться меньше.) , все остальное не уменьшает. Значит, нужно все элементы GUI приводить снова к размеру QLabel.
Принудительно - setGeometry().
Либо разобраться с лэйаутом, и привязать размер окна к размеру лейаута.

У меня там не только лейблы, много всяких элементов.

Смысл в том, что у меня есть QTabWidget, в котором все живет. А табвиджет живет внутри QDialog.
Так вот при изменении увеличении размера шрифта, таб виджет отлично меняет размеры как в большую, так и в меньшую сторону.

А вот QDialog при уменьшении остается вытянутым, если размер шрифта уменьшить. В результате получаются отступы.
Прикрепил скрины для наглядности.
Записан
Nidxogg
Гость
« Ответ #6 : Ноябрь 06, 2014, 22:15 »

Оффтопну - это qss?
Записан
Hrundel
Гость
« Ответ #7 : Ноябрь 07, 2014, 01:06 »

Ну, тогда все должно быть просто. Чистая принудиловка!

Код
C++ (Qt)
SettingsWidget->setGeometry(0, 0, tabWidget->width() + x, tabWidget->height() + y);
Записан
vulko
Гость
« Ответ #8 : Ноябрь 07, 2014, 09:28 »

Ну, тогда все должно быть просто. Чистая принудиловка!

Код
C++ (Qt)
SettingsWidget->setGeometry(0, 0, tabWidget->width() + x, tabWidget->height() + y);

Спс, попробую.


Совсем забыл вот ещё что,

Код:
void SettingsWidget::paintEvent(QPaintEvent *evt) {
    QPainter painter(this);
    QRect bg = evt->rect();

    // background
    QLinearGradient bgGradient(bg.topLeft(), bg.bottomLeft());
    bgGradient.setColorAt(0, QColor(255, 255, 255, 80));
    bgGradient.setColorAt(1, QColor(255, 255, 255, 50));
    painter.fillRect(bg, bgGradient);
}


Может нужно заменить evt->rect() на что-нибудь другое?
Записан
vulko
Гость
« Ответ #9 : Ноябрь 07, 2014, 09:31 »

Оффтопну - это qss?

стили почти все в css. контейнер (qdialog) в данном случае имеет переопределенный paintEvent.
Записан
Hrundel
Гость
« Ответ #10 : Ноябрь 07, 2014, 11:55 »

Оффтопну - это qss?

нет.
Записан
Hrundel
Гость
« Ответ #11 : Ноябрь 07, 2014, 11:56 »

Цитировать
Совсем забыл вот ещё что,

Код:
void SettingsWidget::paintEvent(QPaintEvent *evt) {

}


Может нужно заменить evt->rect() на что-нибудь другое?

Зачем? Оно ведь и так все успешно рисует.
Записан
vulko
Гость
« Ответ #12 : Ноябрь 07, 2014, 12:28 »

Цитировать
Совсем забыл вот ещё что,

Код:
void SettingsWidget::paintEvent(QPaintEvent *evt) {

}


Может нужно заменить evt->rect() на что-нибудь другое?

Зачем? Оно ведь и так все успешно рисует.

Это в наследство досталось. У меня все виджеты с кастомной отрисовкой, этот тоже возможно переделаю, пока он тупо градиентом залит...

В идеале конечно оставить эту отрисовку и зафиксить это по другому.

Кстати остальные виджеты такой болезнью не страдают, но для них задается размер с помощью resize...
А этот вообще без размера.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #13 : Ноябрь 07, 2014, 13:30 »

После изменения размера шрифта вызывай QDialog::adjustSize().
Записан

Qt 5.11/4.8.7 (X11/Win)
vulko
Гость
« Ответ #14 : Ноябрь 07, 2014, 13:46 »

После изменения размера шрифта вызывай QDialog::adjustSize().

Попробовал, работает, но как-то странно...
После первого уменьшения размер старый, после второго вроде приходит в норму. Но тоже не всегда, иногда отступы по бокам чуть больше чем изначально...

П.с. все это под X на дебианообразном линуксе.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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