Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: vulko от Октябрь 16, 2014, 15:57



Название: Изменение размеров шрифта внутри QWidget во время работы
Отправлено: 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 не хочет уменьшаться...

Вопроса два:
почему так происходит?
как это исправить?


Название: Re: Изменение размеров шрифта внутри QWidget во время работы
Отправлено: vulko от Октябрь 31, 2014, 15:26
Никто не сталкивался с таким?


Название: Re: Изменение размеров шрифта внутри QWidget во время работы
Отправлено: Hrundel от Ноябрь 01, 2014, 14:20
Лично я нигде в твоем коде не увидел, что он делает для того, чтобы QDialog уменьшился.


Название: Re: Изменение размеров шрифта внутри QWidget во время работы
Отправлено: vulko от Ноябрь 05, 2014, 09:28
Лично я нигде в твоем коде не увидел, что он делает для того, чтобы QDialog уменьшился.

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

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

Увеличиваю размер шрифта, виджет растягивается. Уменьшаю - виджет остается таким же.
Что сделать чтобы виджет всегда принимал минимально нужный размер?


Название: Re: Изменение размеров шрифта внутри QWidget во время работы
Отправлено: Hrundel от Ноябрь 05, 2014, 19:30
Дело в том, что у тебя есть QBoxLayout, который автоматически расширяет QDialog.
Кода QLabel уменьшает свой размер (что навряд-ли. Полагаю, что размер остается после расширения такой же. Просто букв становиться меньше.) , все остальное не уменьшает. Значит, нужно все элементы GUI приводить снова к размеру QLabel.
Принудительно - setGeometry().
Либо разобраться с лэйаутом, и привязать размер окна к размеру лейаута.


Название: Re: Изменение размеров шрифта внутри QWidget во время работы
Отправлено: vulko от Ноябрь 06, 2014, 10:23
Дело в том, что у тебя есть QBoxLayout, который автоматически расширяет QDialog.
Кода QLabel уменьшает свой размер (что навряд-ли. Полагаю, что размер остается после расширения такой же. Просто букв становиться меньше.) , все остальное не уменьшает. Значит, нужно все элементы GUI приводить снова к размеру QLabel.
Принудительно - setGeometry().
Либо разобраться с лэйаутом, и привязать размер окна к размеру лейаута.

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

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

А вот QDialog при уменьшении остается вытянутым, если размер шрифта уменьшить. В результате получаются отступы.
Прикрепил скрины для наглядности.


Название: Re: Изменение размеров шрифта внутри QWidget во время работы
Отправлено: Nidxogg от Ноябрь 06, 2014, 22:15
Оффтопну - это qss?


Название: Re: Изменение размеров шрифта внутри QWidget во время работы
Отправлено: Hrundel от Ноябрь 07, 2014, 01:06
Ну, тогда все должно быть просто. Чистая принудиловка!

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


Название: Re: Изменение размеров шрифта внутри QWidget во время работы
Отправлено: vulko от Ноябрь 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() на что-нибудь другое?


Название: Re: Изменение размеров шрифта внутри QWidget во время работы
Отправлено: vulko от Ноябрь 07, 2014, 09:31
Оффтопну - это qss?

стили почти все в css. контейнер (qdialog) в данном случае имеет переопределенный paintEvent.


Название: Re: Изменение размеров шрифта внутри QWidget во время работы
Отправлено: Hrundel от Ноябрь 07, 2014, 11:55
Оффтопну - это qss?

нет.


Название: Re: Изменение размеров шрифта внутри QWidget во время работы
Отправлено: Hrundel от Ноябрь 07, 2014, 11:56
Цитировать
Совсем забыл вот ещё что,

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

}


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

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


Название: Re: Изменение размеров шрифта внутри QWidget во время работы
Отправлено: vulko от Ноябрь 07, 2014, 12:28
Цитировать
Совсем забыл вот ещё что,

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

}


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

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

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

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

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


Название: Re: Изменение размеров шрифта внутри QWidget во время работы
Отправлено: GreatSnake от Ноябрь 07, 2014, 13:30
После изменения размера шрифта вызывай QDialog::adjustSize().


Название: Re: Изменение размеров шрифта внутри QWidget во время работы
Отправлено: vulko от Ноябрь 07, 2014, 13:46
После изменения размера шрифта вызывай QDialog::adjustSize().

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

П.с. все это под X на дебианообразном линуксе.


Название: Re: Изменение размеров шрифта внутри QWidget во время работы
Отправлено: GreatSnake от Ноябрь 07, 2014, 13:50
Поменяй
Код
C++ (Qt)
QBoxLayout *mainLayout = new QBoxLayout(QBoxLayout::TopToBottom, this);
mainLayout->addWidget(tabWidget, 0, Qt::AlignCenter);
на
Код
C++ (Qt)
QVBoxLayout *mainLayout = new QVBoxLayout(this);
mainLayout->addWidget(tabWidget);

И добавь
Код
C++ (Qt)
mainLayout->setSizeConstraint(QLayout::SetFixedSize);


Название: Re: Изменение размеров шрифта внутри QWidget во время работы
Отправлено: vulko от Ноябрь 07, 2014, 14:16
Поменяй
Код
C++ (Qt)
QBoxLayout *mainLayout = new QBoxLayout(QBoxLayout::TopToBottom, this);
mainLayout->addWidget(tabWidget, 0, Qt::AlignCenter);
на
Код
C++ (Qt)
QVBoxLayout *mainLayout = new QVBoxLayout(this);
mainLayout->addWidget(tabWidget);

И добавь
Код
C++ (Qt)
mainLayout->setSizeConstraint(QLayout::SetFixedSize);


fixed size тут не в тему совсем... обрезает он таб виджет, как и setfixedsize для виджета settingswidget.

сделал без него, но переделал на qvboxlayout + adjustsize и заработало... правда теперь при изменении размеров шрифта иногда тупит размер окна, но отступы правильные.

так например после однократного изменения размера шрифта, ширина виджета при 8pt почему то больше чем при 9pt...

но это уже определенно лучше.


Название: Re: Изменение размеров шрифта внутри QWidget во время работы
Отправлено: Hrundel от Ноябрь 07, 2014, 22:16
одно скажу - Большой Змей плохому не научит. :D