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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTabWidget<>QTabBar авто ширина вкладок  (Прочитано 10102 раз)
xint
Гость
« : Февраль 10, 2013, 07:13 »

Всем привет, такая задача, всю голову поломал, работаю с QTabWidget, каким способом можно сделать что бы вкладки автоматически уменьшались<>увеличивались в ширину в зависимости от их кол-ва и размера главного окна...аналог Google Chrome, там создаем вкладки и если они не помещаются то они уменьшаются в ширину, а когда растягиваешь главное окно, они увеличиваются если появляется место...

Задаем минимальную ширину и максимальную. А каким инструментом лучше всего сделать регулировку их размеров? Да так, что бы попроще, без различных эвентов, расчетов текущей ширины и т.д, если возможно...
Можно Layout задать всем табам сразу? Например горизонтальный, который и будет регулировать их размер, между минимальной<>максимальной шириной

Такой вот вопрос...подскажите пожалуйста..

Скрин для наглядности

Записан
UNION labs
Гость
« Ответ #1 : Февраль 10, 2013, 11:09 »

Можно вот так сделать

Код:
#include <QtGui/QTabBar>

class MyTabBar : public QTabBar {
    Q_OBJECT
public:
    explicit MyTabBar( QWidget *parent = 0 ) :
        QTabBar( parent ) {
        setExpanding( false );
    }

private:
    void paintEvent(QPaintEvent *event) {
        const int spacing = 2;
        int tabWidth = width() / count() - spacing;
        setStyleSheet( QString( "QTabBar::tab { width: %1px; }" ).arg( tabWidth ) );
        QTabBar::paintEvent( event );
    }
};
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #2 : Февраль 10, 2013, 11:43 »

dimkanovikov
Боже, убейтесь...

Код:
bool TabBar::event(QEvent *event)
{
    if (event->type() == QEvent::Polish)
        cachedHeight = -1;
    return QTabBar::event(event);
}

QSize TabBar::tabSizeHint(int index) const
{
    if (cachedHeight == -1)
        cachedHeight = QTabBar::tabSizeHint(index).height();
    return QSize(qBound(100, width()/count(), 200), cachedHeight);
}
Записан
UNION labs
Гость
« Ответ #3 : Февраль 10, 2013, 11:52 »

Авварон
Спасибо, рано ещё. Сразу видно отличие "Джедая : наставника для всех" от "Новичка".
За решение спасибо, тоже возьму на заметку.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #4 : Февраль 10, 2013, 12:02 »

Вообще, можно без кеширования высоты сделать, но у меня профайлер показывал, что при старте аппы с 20ю вкладками родной рассчет сайзхинта вылезал наверх по "тяжелости". Что весьма забавно, чай не 1000 вкладок.
Записан
xint
Гость
« Ответ #5 : Февраль 10, 2013, 12:49 »

Отлично! Спасибо ребят, то что нужно, только всего два вопроса

1. Как установить максимальную ширину вкладки, больше которой она не растянется
2. Как правильно добавить этот TabBar в QTabWidget, добавить то я его добавил, и брать ширину нужно уже у QTabWidget'a а не TabBar'a но tabSizeHint срабатывает только 1 раз, при установки QTabBar'a...я конечно сейчас буду пытаться реализовать, если смогу ) Спасибо еще раз..
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #6 : Февраль 10, 2013, 19:39 »

Отлично! Спасибо ребят, то что нужно, только всего два вопроса

1. Как установить максимальную ширину вкладки, больше которой она не растянется
2. Как правильно добавить этот TabBar в QTabWidget, добавить то я его добавил, и брать ширину нужно уже у QTabWidget'a а не TabBar'a но tabSizeHint срабатывает только 1 раз, при установки QTabBar'a...я конечно сейчас буду пытаться реализовать, если смогу ) Спасибо еще раз..


1. Никак. Вы задаете точный размер вкладки с помощью метода sizeHint(). В нем вы можете ограничить ширину - я в примере вверху ограничиваю 200ми пикселями сверху и 100 снизу.
2. Ширина табара == ширине табвиджета (минус кнопки). Сайзхинт будет вызываться при изменении размеров табвиджета (и, как следствие, таббара)
Записан
xint
Гость
« Ответ #7 : Февраль 14, 2013, 08:45 »

Спасибо за помощь!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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