У меня есть QTabWidget с несколькими вкладками фиксированного размера. Я хотел бы разместить виджет вкладок в макете, чтобы он растягивался вместе с основным окном, но это приводит к появлению скроллера справа от вкладок, когда я уменьшаю его, или пустого пространства справа от вкладок, когда я растягиваю это из. Мне бы хотелось, чтобы вкладки автоматически заполняли всю длину QTabWidget.
Виджет вкладок очень строго гарантирует, что внутри QTabBar создается минимальный размер. Однако еще не все потеряно.
Поскольку у нас есть доступ к QTabBar и вкладкам внутри него, мы можем кое-что сделать. Я нашел следующее ответ который предлагает простой обходной путь.
В основном, используя таблицу стилей, мы устанавливаем ширину вкладок на основе текущей ширины виджета вкладок. Хитрость заключается в том, чтобы гарантировать, что если ширина виджета с вкладками изменится, мы повторно проведем этот расчет.
Предложенный способ сделать это был с EventFilter. В основном все, что нужно, это следующий класс:
// On resize events, reapply the expanding tabs style sheet
class ResizeFilter : public QObject
{
QTabWidget *target;
public:
ResizeFilter(QTabWidget *target) : QObject(target), target(target) {}
bool eventFilter(QObject *object, QEvent *event)
{
if (event->type() == QEvent::Resize)
{
// The width of each tab is the width of the tab widget / # of tabs.
target->setStyleSheet(QString("QTabBar::tab { width: %1px; } ")
.arg(target->size().width()/target->count()));
}
return false;
}
};
Затем для вашего конкретного QTabWidget просто установите обработчик событий:
ui.tabWidget->installEventFilter(new ResizeFilter(ui.tabWidget));
Presto!
Хотя есть одна вещь, которую я бы добавил к ответу. Поскольку вкладки имеют одинаковый размер независимо от их отображаемого текста, вы можете убедиться, что вы установили свойство «elideMode» в QTabWidget для обработки случаев, когда на вкладке недостаточно места для отображения всего заголовка. Это позволит обрезать текст по размеру и добавить «…».
Вам нужно будет установить для QSizePolicy значение MinimumExpanding на вашем виджете со вкладкой, должен быть определен минимальный размер, чтобы он не уменьшался, также установите setWidgetResizable (true). Также установите правильный QSizePolicy для дочерних виджетов и определите макет (HBox, VBox, Grid) для tab-виджета.