Как я могу изменить размер QTabWidget?

Моя программа выполняет расчет и выводит несколько схем, нарисованных на этикетке (используя QPixmap). Я показываю ярлык на каждой вкладке.

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

Сначала я удаляю все предыдущие вкладки с помощью removeTab(), а затем создаю новые вкладки. Единственное, что не удаляется, это само QTabWidget, конечно.

При работе с небольшими чертежами размер вкладки увеличивается с увеличением чертежей. Но это не работает наоборот.

Как я могу это исправить? Следующий код не работает:

layout_tabs = new QTabWidget;
layout_tabs->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);

Я использую QT-4.8.4.


person Kees Bergwerf    schedule 04.02.2013    source источник


Ответы (1)


Можете ли вы (пользователь) вручную изменить размер окна с помощью мыши на что-то меньшее после переключения на меньшие метки?

Если это так, то, вероятно, произошло то, что размер родительского виджета (т. е. окна) изменился, чтобы вместить более крупный дочерний виджет QTabWidget. Когда метки меньшего размера появляются после больших меток, QTabWidget по-прежнему будет занимать столько места, сколько ему отведено его родителем, если только другому виджету на том же уровне в его иерархии макета не будет отдано предпочтение. Поскольку родительское окно не стало меньше, размер QTabWidget тоже.

Итак, попробуйте изменить размер родительского виджета (QMainWindow или что-то еще) после удаления вкладок, и виджет вкладок должен следовать. В Qt сжатие часто должно происходить сверху, тогда как расширение может происходить как сверху, так и снизу. Что-то вроде этого может сработать (не проверено)...

while(layout_tabs->count() > 0)
{
    QWidget* removedtab = layout_tabs->widget(0);
    layout_tabs->removeTab(0); //removeTab() doesn't delete the widget
    removedtab->deleteLater(); //so you have to delete it yourself
}
layout_tabs->updateGeometry();
mainwindow->resize(mainwindow->minimumSize());

изменить Обратите внимание, что QLayoutTab::removeTab() не удаляет вкладку, которую вы удалили, поэтому вам нужно будет как-то удалить ее самостоятельно, например, в только что добавленном фрагменте кода, потому что удаленная вкладка больше не имеет родителя.

person Phlucious    schedule 05.02.2013
comment
Спасибо за Ваш ответ! Да, я могу изменить размер окна с помощью мыши :-) Почему я не подумал об этом. Хорошо, я попробую updategeometry() и сообщу вам, удалось ли это. - person Kees Bergwerf; 09.02.2013
comment
Одна проблема заключалась в том, что я поместил свой qtabwidget в qdockwidget. КОГДА я просто делаю layout_tabs = new QTabWidget; все работает хорошо. За исключением того, что вкладки не закрываются, когда мое главное окно закрывается. - person Kees Bergwerf; 09.02.2013
comment
Убедитесь, что каждый виджет, который вы new, имеет QObject родителя, либо передав его конструктору, либо поместив виджет внутри другого виджета с помощью макета. QObjects, включая QWidgets и их потомков, будут удалять любые дочерние элементы в своих деструкторах. Также см. мой новый комментарий о QTabWidget::removeTab() . - person Phlucious; 09.02.2013