Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt GUI _ В QTabBar сделать все вкладки невыбранными

Автор: tp4 5.7.2011, 15:14

Здравствуйте, господа.

Собственно, вопрос сформулировал в названии: Как QTabBar сделать все вкладки невыбранными?

Безуспешно пробовал:
1. QTabBar::setCurrentIndex(-1);

2. Переопределял QSize QTabBar::tabSizeHint ( int index ) const, что бы он возвращал очень маленький QSize для фиктивной нулевой вкладки. Не привело к требуемым результатам.

Буду очень благодарен за советы.

Автор: RazrFalcon 5.7.2011, 15:44

Без возможности выбора что ли?
Что вы хотите что бы отображалось при запуске проги?
Если у вас не только только вкладки на форме, то можно в дизайнере выбрать порядок активации, то есть задать номера всем элементам.

Автор: tp4 5.7.2011, 16:15

Цитата(RazrFalcon @ 5.7.2011, 16:44) *
Без возможности выбора что ли?

Нет, с возможностью выбора. Более того, из состояния "выбрана i-ая вкладка" должен быть реализован переход в состояние "не выбрана никакая вкладка". Но это тонкости, главное, как это сделать концептуально.

Цитата(RazrFalcon @ 5.7.2011, 16:44) *
Что вы хотите что бы отображалось при запуске проги?

При запуске QTabBar невиден, т.к. не содержит вкладок. Он обрастает вкладками в процессе работы программы.

Цитата(RazrFalcon @ 5.7.2011, 16:44) *
Если у вас не только только вкладки на форме, то можно в дизайнере выбрать порядок активации, то есть задать номера всем элементам.

Речь идет о задании выбора виджетов по нажатию на таб? Не совсем ясно, как это мне поможет.

Автор: RazrFalcon 5.7.2011, 17:12

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


Автор: tp4 5.7.2011, 17:49

Цитата(RazrFalcon @ 5.7.2011, 18:12) *
Честно сказать - ничего не понял.

Виноват, значит плохо объяснил. Постараюсь еще разок.

Цитата(RazrFalcon @ 5.7.2011, 18:12) *
Вам нужно что бы при запуске таббар был скрыт, а потом, во время работы проги, появлялись новые вкладки?

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

Постараюсь по-четче освятить смысл такого элемента.
Изначально в окне программы присутствуют некоторые виджеты (QTreeView, QTableView и т.д.), с помощью которых пользователь перемещается по различным элементам модели. Вдруг пользователь захотел модифицировать какой-то элемент, но хочет сделать это позже. Тогда он нажимает кнопку и в QTabBar'е появляется tab, которому соответствует текущий контекст с возможностью редактирования. Так пользователь сёрфит по данным и делает закладки.Таким образом вкладки соответствуют отложенным состояниям модификации данных. Необходимо, чтобы можно было перевести таббар в состояние, когда ни одна вкладка не выбрана, что соответствует режиму просмотра.
Итак, назначение QTabBar'а в этом случае - реализация поддержки механизма закладок.

Наверное, я много чего хочу, и придется писать свой контрол.

Автор: RazrFalcon 5.7.2011, 18:27

Что такое, только обе вкладки не активны?
http://itmages.ru/image/view/225518/6ded7cc5
Если да, то без понятия, никогда не сталкивался :unsure:

Автор: Litkevich Yuriy 5.7.2011, 18:30

Цитата(tp4 @ 5.7.2011, 19:15) *
"не выбрана никакая вкладка".
это логически не возможно. Есть записная книжка - "никакая страница не открыта", что это значит, будут ли видны вкладки страниц?

Автор: tp4 5.7.2011, 18:49

Цитата(Litkevich Yuriy @ 5.7.2011, 19:30) *
Цитата(tp4 @ 5.7.2011, 19:15) *
"не выбрана никакая вкладка".
это логически не возможно. Есть записная книжка - "никакая страница не открыта", что это значит, будут ли видны вкладки страниц?


Пусть лучше блокнот с рецептами. Человек прочитывает его мельком и делает несколько временных закладок - просто бумажки вложил в нужные страницы. Потом думает: "Ой, а закладку на страничке с борщом забыл сделать". Открывает опять блокнот сначала и ищет требуемую запись. В этот момент все сделанные им временные закладки не активны, но видны.

Автор: ilyabvt 5.7.2011, 18:51

Цитата
2. Переопределял QSize QTabBar::tabSizeHint ( int index ) const, что бы он возвращал очень маленький QSize для фиктивной нулевой вкладки. Не привело к требуемым результатам.

Ну можно размер вкладки задать через "Style Sheets"
QTabBar::tab:first {
max-width: 0px;
}

Вот тебе первая вкладка будет "фиктивной" только еще текст с нее надо убрать.

Автор: Litkevich Yuriy 6.7.2011, 3:17

Цитата(tp4 @ 5.7.2011, 21:49) *
Открывает опять блокнот сначала и ищет требуемую запись. В этот момент все сделанные им временные закладки не активны
Стало быть концепт с вкладками отсутствует. А QTabBar только его и реализует.
Но ещё важный момент - Открывает опять блокнот сначала, и при этом видит самую первую страницу блокнота! Т.е. Что-то он должен увидеть на мете "страницы" в программе.

Я полагаю, что нужно делать свой виджет - Закладку, очень может быть, на основе QTabBar. Так можно реализовать и логику и, возможно, более подходящее оформление.

Автор: tp4 6.7.2011, 10:15

Цитата(ilyabvt @ 5.7.2011, 19:51) *
QTabBar::tab:first {
max-width: 0px;
}


Спасибо большое. Пожалуй это то, что нужно. Но возникли некоторые проблемы:

QApplication a(argc, argv);

    QTabBar tabBar;
    tabBar.addTab("");
    tabBar.addTab("1");
    tabBar.addTab("2");
    tabBar.show();

    QTabWidget tabWgt;
    tabWgt.addTab(new QTreeWidget,"");
    tabWgt.addTab(new QTreeWidget,"1");
    tabWgt.addTab(new QTreeWidget,"2");
    tabWgt.show();

    a.setStyleSheet(    "QTabBar::tab:first {"
                        "  max-width: 0px;"
                        "}"
                    );

    return a.exec();


Вот что получилось:


Почему-то стили применились только к таббару в составе QTableWidget, но не к одинокому QTabBar'у. В чем может быть проблема?



Автор: ilyabvt 6.7.2011, 20:37

Дело в том что окно имеет определенную минимальную ширину меньше которой нельзя сжать стоит добавить еще 2 таба и применять стиль не ко всему приложению а к конкретному виджету и проблема почти решена.

QTabBar tabBar;
    tabBar.addTab("");
    tabBar.addTab("1");
    tabBar.addTab("2");
    tabBar.addTab("3");
    tabBar.addTab("4");
    tabBar.addTab("5");
    tabBar.setStyleSheet(    "QTabBar::tab:first {"
                        "  max-width: 0px;"
                        "}"
                        );
    tabBar.show();


Почти потому что при изменении размеров QTabBar изменяются размеры табов включая тот которому это запрещено. Вот хз отчего это. Может проще свой таббар написать? Тебе от него сильно большая функциональность нужна?

Ну или как вариант поставить такой стиль что бы выбранная вкладка выглядела также как не выбранная. Что-нибудь типа:
QTabBar::tab {
   background-color: rgb(255, 255, 255);
   border: 2px solid blue;
   padding: 4px;
}

И ставить такой стиль, когда нужно будет поставить состояние "не выбрано ничего". Когда нужно выбрать вкладку можно будет вернуть стиль на такой что б выбранная вкладка как то выделялась.
P.S. В стилях не силен, но можно сделать достаточно красиво.
P.P.S. А по хорошему мне очень любопытно какого фига первый таб менял свой размер...

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)