summaryrefslogtreecommitdiffstats
path: root/src/widgets/widgets
diff options
context:
space:
mode:
Diffstat (limited to 'src/widgets/widgets')
-rw-r--r--src/widgets/widgets/qcombobox.cpp61
-rw-r--r--src/widgets/widgets/qcombobox_p.h7
-rw-r--r--src/widgets/widgets/qmaccocoaviewcontainer_mac.mm2
-rw-r--r--src/widgets/widgets/qmainwindow.cpp2
-rw-r--r--src/widgets/widgets/qtabbar.cpp172
-rw-r--r--src/widgets/widgets/qtabbar.h3
-rw-r--r--src/widgets/widgets/qtabbar_p.h9
-rw-r--r--src/widgets/widgets/qtabwidget.cpp50
-rw-r--r--src/widgets/widgets/qtabwidget.h3
-rw-r--r--src/widgets/widgets/qtoolbarlayout.cpp2
10 files changed, 282 insertions, 29 deletions
diff --git a/src/widgets/widgets/qcombobox.cpp b/src/widgets/widgets/qcombobox.cpp
index 19b442f477..d786c7ff83 100644
--- a/src/widgets/widgets/qcombobox.cpp
+++ b/src/widgets/widgets/qcombobox.cpp
@@ -129,7 +129,15 @@ QStyleOptionMenuItem QComboMenuDelegate::getStyleOption(const QStyleOptionViewIt
if (option.state & QStyle::State_Selected)
menuOption.state |= QStyle::State_Selected;
menuOption.checkType = QStyleOptionMenuItem::NonExclusive;
- menuOption.checked = mCombo->currentIndex() == index.row();
+ // a valid checkstate means that the model has checkable items
+ const QVariant checkState = index.data(Qt::CheckStateRole);
+ if (!checkState.isValid()) {
+ menuOption.checked = mCombo->currentIndex() == index.row();
+ } else {
+ menuOption.checked = qvariant_cast<int>(checkState) == Qt::Checked;
+ menuOption.state |= qvariant_cast<int>(checkState) == Qt::Checked
+ ? QStyle::State_On : QStyle::State_Off;
+ }
if (QComboBoxDelegate::isSeparator(index))
menuOption.menuItemType = QStyleOptionMenuItem::Separator;
else
@@ -164,7 +172,7 @@ QStyleOptionMenuItem QComboMenuDelegate::getStyleOption(const QStyleOptionViewIt
// that order, also override the font for the popup menu.
QVariant fontRoleData = index.data(Qt::FontRole);
if (fontRoleData.isValid()) {
- menuOption.font = fontRoleData.value<QFont>();
+ menuOption.font = qvariant_cast<QFont>(fontRoleData);
} else if (mCombo->testAttribute(Qt::WA_SetFont)
|| mCombo->testAttribute(Qt::WA_MacSmallSize)
|| mCombo->testAttribute(Qt::WA_MacMiniSize)
@@ -179,6 +187,55 @@ QStyleOptionMenuItem QComboMenuDelegate::getStyleOption(const QStyleOptionViewIt
return menuOption;
}
+bool QComboMenuDelegate::editorEvent(QEvent *event, QAbstractItemModel *model,
+ const QStyleOptionViewItem &option, const QModelIndex &index)
+{
+ Q_ASSERT(event);
+ Q_ASSERT(model);
+
+ // make sure that the item is checkable
+ Qt::ItemFlags flags = model->flags(index);
+ if (!(flags & Qt::ItemIsUserCheckable) || !(option.state & QStyle::State_Enabled)
+ || !(flags & Qt::ItemIsEnabled))
+ return false;
+
+ // make sure that we have a check state
+ const QVariant checkState = index.data(Qt::CheckStateRole);
+ if (!checkState.isValid())
+ return false;
+
+ // make sure that we have the right event type
+ if ((event->type() == QEvent::MouseButtonRelease)
+ || (event->type() == QEvent::MouseButtonDblClick)
+ || (event->type() == QEvent::MouseButtonPress)) {
+ QMouseEvent *me = static_cast<QMouseEvent*>(event);
+ if (me->button() != Qt::LeftButton)
+ return false;
+
+ if ((event->type() == QEvent::MouseButtonPress)
+ || (event->type() == QEvent::MouseButtonDblClick)) {
+ pressedIndex = index.row();
+ return false;
+ }
+
+ if (index.row() != pressedIndex)
+ return false;
+ pressedIndex = -1;
+
+ } else if (event->type() == QEvent::KeyPress) {
+ if (static_cast<QKeyEvent*>(event)->key() != Qt::Key_Space
+ && static_cast<QKeyEvent*>(event)->key() != Qt::Key_Select)
+ return false;
+ } else {
+ return false;
+ }
+
+ // we don't support user-tristate items in QComboBox (not implemented in any style)
+ Qt::CheckState newState = (static_cast<Qt::CheckState>(checkState.toInt()) == Qt::Checked)
+ ? Qt::Unchecked : Qt::Checked;
+ return model->setData(index, newState, Qt::CheckStateRole);
+}
+
#if QT_CONFIG(completer)
void QComboBoxPrivate::_q_completerActivated(const QModelIndex &index)
{
diff --git a/src/widgets/widgets/qcombobox_p.h b/src/widgets/widgets/qcombobox_p.h
index c79406eafd..7a3fcf6e0f 100644
--- a/src/widgets/widgets/qcombobox_p.h
+++ b/src/widgets/widgets/qcombobox_p.h
@@ -266,7 +266,9 @@ class Q_AUTOTEST_EXPORT QComboMenuDelegate : public QAbstractItemDelegate
{
Q_OBJECT
public:
- QComboMenuDelegate(QObject *parent, QComboBox *cmb) : QAbstractItemDelegate(parent), mCombo(cmb) {}
+ QComboMenuDelegate(QObject *parent, QComboBox *cmb)
+ : QAbstractItemDelegate(parent), mCombo(cmb), pressedIndex(-1)
+ {}
protected:
void paint(QPainter *painter,
@@ -282,11 +284,14 @@ protected:
return mCombo->style()->sizeFromContents(
QStyle::CT_MenuItem, &opt, option.rect.size(), mCombo);
}
+ bool editorEvent(QEvent *event, QAbstractItemModel *model,
+ const QStyleOptionViewItem &option, const QModelIndex &index) override;
private:
QStyleOptionMenuItem getStyleOption(const QStyleOptionViewItem &option,
const QModelIndex &index) const;
QComboBox *mCombo;
+ int pressedIndex;
};
// ### Qt6: QStyledItemDelegate ?
diff --git a/src/widgets/widgets/qmaccocoaviewcontainer_mac.mm b/src/widgets/widgets/qmaccocoaviewcontainer_mac.mm
index 88baf0410b..f261314c64 100644
--- a/src/widgets/widgets/qmaccocoaviewcontainer_mac.mm
+++ b/src/widgets/widgets/qmaccocoaviewcontainer_mac.mm
@@ -138,7 +138,7 @@ QMacCocoaViewContainerPrivate::~QMacCocoaViewContainerPrivate()
*/
QMacCocoaViewContainer::QMacCocoaViewContainer(NSView *view, QWidget *parent)
- : QWidget(*new QMacCocoaViewContainerPrivate, parent, 0)
+ : QWidget(*new QMacCocoaViewContainerPrivate, parent, {})
{
// Ensures that we have a QWindow, even if we're not a top level widget
setAttribute(Qt::WA_NativeWindow);
diff --git a/src/widgets/widgets/qmainwindow.cpp b/src/widgets/widgets/qmainwindow.cpp
index 7f0f3342b6..4f94b81b19 100644
--- a/src/widgets/widgets/qmainwindow.cpp
+++ b/src/widgets/widgets/qmainwindow.cpp
@@ -1364,6 +1364,8 @@ void QMainWindow::setUnifiedTitleAndToolBarOnMac(bool set)
createWinId();
QPlatformNativeInterface *nativeInterface = QGuiApplication::platformNativeInterface();
+ if (!nativeInterface)
+ return; // Not Cocoa platform plugin.
QPlatformNativeInterface::NativeResourceForIntegrationFunction function =
nativeInterface->nativeResourceFunctionForIntegration("setContentBorderEnabled");
if (!function)
diff --git a/src/widgets/widgets/qtabbar.cpp b/src/widgets/widgets/qtabbar.cpp
index 4e75cca704..aff95b0931 100644
--- a/src/widgets/widgets/qtabbar.cpp
+++ b/src/widgets/widgets/qtabbar.cpp
@@ -207,8 +207,8 @@ void QTabBarPrivate::initBasicStyleOption(QStyleOptionTab *option, int tabIndex)
else
option->selectedPosition = QStyleOptionTab::NotAdjacent;
- const bool paintBeginning = (tabIndex == 0) || (dragInProgress && tabIndex == pressedIndex + 1);
- const bool paintEnd = (tabIndex == totalTabs - 1) || (dragInProgress && tabIndex == pressedIndex - 1);
+ const bool paintBeginning = (tabIndex == firstVisible) || (dragInProgress && tabIndex == pressedIndex + 1);
+ const bool paintEnd = (tabIndex == lastVisible - 1) || (dragInProgress && tabIndex == pressedIndex - 1);
if (paintBeginning) {
if (paintEnd)
option->position = QStyleOptionTab::OnlyOneTab;
@@ -459,6 +459,7 @@ void QTabBarPrivate::layoutTabs()
int i;
bool vertTabs = verticalTabs(shape);
int tabChainIndex = 0;
+ int hiddenTabs = 0;
Qt::Alignment tabAlignment = Qt::Alignment(q->style()->styleHint(QStyle::SH_TabBar_Alignment, nullptr, q));
QVector<QLayoutStruct> tabChain(tabList.count() + 2);
@@ -484,7 +485,11 @@ void QTabBarPrivate::layoutTabs()
int minx = 0;
int x = 0;
int maxHeight = 0;
- for (i = 0; i < tabList.count(); ++i, ++tabChainIndex) {
+ for (i = 0; i < tabList.count(); ++i) {
+ if (!tabList.at(i).visible) {
+ ++hiddenTabs;
+ continue;
+ }
QSize sz = q->tabSizeHint(i);
tabList[i].maxRect = QRect(x, 0, sz.width(), sz.height());
x += sz.width();
@@ -500,6 +505,7 @@ void QTabBarPrivate::layoutTabs()
if (!expanding)
tabChain[tabChainIndex].maximumSize = tabChain[tabChainIndex].sizeHint;
+ ++tabChainIndex;
}
last = minx;
@@ -509,7 +515,11 @@ void QTabBarPrivate::layoutTabs()
int miny = 0;
int y = 0;
int maxWidth = 0;
- for (i = 0; i < tabList.count(); ++i, ++tabChainIndex) {
+ for (i = 0; i < tabList.count(); ++i) {
+ if (!tabList.at(i).visible) {
+ ++hiddenTabs;
+ continue;
+ }
QSize sz = q->tabSizeHint(i);
tabList[i].maxRect = QRect(0, y, sz.width(), sz.height());
y += sz.height();
@@ -525,6 +535,7 @@ void QTabBarPrivate::layoutTabs()
if (!expanding)
tabChain[tabChainIndex].maximumSize = tabChain[tabChainIndex].sizeHint;
+ ++tabChainIndex;
}
last = miny;
@@ -538,14 +549,20 @@ void QTabBarPrivate::layoutTabs()
&& (tabAlignment != Qt::AlignRight)
&& (tabAlignment != Qt::AlignJustify);
tabChain[tabChainIndex].empty = true;
- Q_ASSERT(tabChainIndex == tabChain.count() - 1); // add an assert just to make sure.
+ Q_ASSERT(tabChainIndex == tabChain.count() - 1 - hiddenTabs); // add an assert just to make sure.
// Do the calculation
qGeomCalc(tabChain, 0, tabChain.count(), 0, qMax(available, last), 0);
// Use the results
+ hiddenTabs = 0;
for (i = 0; i < tabList.count(); ++i) {
- const QLayoutStruct &lstruct = tabChain.at(i + 1);
+ if (!tabList.at(i).visible) {
+ tabList[i].rect = QRect();
+ ++hiddenTabs;
+ continue;
+ }
+ const QLayoutStruct &lstruct = tabChain.at(i + 1 - hiddenTabs);
if (!vertTabs)
tabList[i].rect.setRect(lstruct.pos, 0, lstruct.size, maxExtent);
else
@@ -975,11 +992,15 @@ int QTabBar::insertTab(int index, const QIcon& icon, const QString &text)
#ifndef QT_NO_SHORTCUT
d->tabList[index].shortcutId = grabShortcut(QKeySequence::mnemonic(text));
#endif
+ d->firstVisible = qMax(qMin(index, d->firstVisible), 0);
+ d->lastVisible = qMax(index, d->lastVisible);
d->refresh();
if (d->tabList.count() == 1)
setCurrentIndex(index);
- else if (index <= d->currentIndex)
+ else if (index <= d->currentIndex) {
++d->currentIndex;
+ ++d->lastVisible;
+ }
if (d->closeButtonOnTabs) {
QStyleOptionTab opt;
@@ -1035,6 +1056,9 @@ void QTabBar::removeTab(int index)
if (d->tabList[i].lastTab > index)
--d->tabList[i].lastTab;
}
+
+ d->calculateFirstLastVisible(index, false, true);
+
if (index == d->currentIndex) {
// The current tab is going away, in order to make sure
// we emit that "current has changed", we need to reset this
@@ -1045,16 +1069,14 @@ void QTabBar::removeTab(int index)
case SelectPreviousTab:
if (newIndex > index)
newIndex--;
- if (d->validIndex(newIndex))
+ if (d->validIndex(newIndex) && d->tabList.at(newIndex).visible)
break;
Q_FALLTHROUGH();
case SelectRightTab:
- newIndex = index;
- if (newIndex >= d->tabList.size())
- newIndex = d->tabList.size() - 1;
+ newIndex = qBound(d->firstVisible, index, d->lastVisible);
break;
case SelectLeftTab:
- newIndex = index - 1;
+ newIndex = qBound(d->firstVisible, index-1, d->lastVisible);
if (newIndex < 0)
newIndex = 0;
break;
@@ -1118,9 +1140,52 @@ void QTabBar::setTabEnabled(int index, bool enabled)
#endif
update();
if (!enabled && index == d->currentIndex)
- setCurrentIndex(d->validIndex(index+1)?index+1:0);
- else if (enabled && !d->validIndex(d->currentIndex))
- setCurrentIndex(index);
+ setCurrentIndex(d->selectNewCurrentIndexFrom(index+1));
+ else if (enabled && !isTabVisible(d->currentIndex))
+ setCurrentIndex(d->selectNewCurrentIndexFrom(index));
+ }
+}
+
+
+/*!
+ Returns true if the tab at position \a index is visible; otherwise
+ returns false.
+ \since 5.15
+*/
+bool QTabBar::isTabVisible(int index) const
+{
+ Q_D(const QTabBar);
+ if (d->validIndex(index))
+ return d->tabList.at(index).visible;
+ return false;
+}
+
+/*!
+ If \a visible is true, make the tab at position \a index visible,
+ otherwise make it hidden.
+ \since 5.15
+*/
+void QTabBar::setTabVisible(int index, bool visible)
+{
+ Q_D(QTabBar);
+ if (QTabBarPrivate::Tab *tab = d->at(index)) {
+ d->layoutDirty = (visible != tab->visible);
+ if (!d->layoutDirty)
+ return;
+ tab->visible = visible;
+ if (tab->leftWidget)
+ tab->leftWidget->setVisible(visible);
+ if (tab->rightWidget)
+ tab->rightWidget->setVisible(visible);
+#ifndef QT_NO_SHORTCUT
+ setShortcutEnabled(tab->shortcutId, visible);
+#endif
+ d->calculateFirstLastVisible(index, visible, false);
+ if (!visible && index == d->currentIndex) {
+ const int newindex = d->selectNewCurrentIndexFrom(index+1);
+ setCurrentIndex(newindex);
+ }
+ update();
}
}
@@ -1291,7 +1356,7 @@ QVariant QTabBar::tabData(int index) const
/*!
Returns the visual rectangle of the tab at position \a
- index, or a null rectangle if \a index is out of range.
+ index, or a null rectangle if \a index is hidden, or out of range.
*/
QRect QTabBar::tabRect(int index) const
{
@@ -1299,6 +1364,8 @@ QRect QTabBar::tabRect(int index) const
if (const QTabBarPrivate::Tab *tab = d->at(index)) {
if (d->layoutDirty)
const_cast<QTabBarPrivate*>(d)->layoutTabs();
+ if (!tab->visible)
+ return QRect();
QRect r = tab->rect;
if (verticalTabs(d->shape))
r.translate(0, -d->scrollOffset);
@@ -1429,8 +1496,10 @@ QSize QTabBar::sizeHint() const
if (d->layoutDirty)
const_cast<QTabBarPrivate*>(d)->layoutTabs();
QRect r;
- for (int i = 0; i < d->tabList.count(); ++i)
- r = r.united(d->tabList.at(i).maxRect);
+ for (int i = 0; i < d->tabList.count(); ++i) {
+ if (d->tabList.at(i).visible)
+ r = r.united(d->tabList.at(i).maxRect);
+ }
QSize sz = QApplication::globalStrut();
return r.size().expandedTo(sz);
}
@@ -1444,8 +1513,10 @@ QSize QTabBar::minimumSizeHint() const
const_cast<QTabBarPrivate*>(d)->layoutTabs();
if (!d->useScrollButtons) {
QRect r;
- for (int i = 0; i < d->tabList.count(); ++i)
- r = r.united(d->tabList.at(i).minRect);
+ for (int i = 0; i < d->tabList.count(); ++i) {
+ if (d->tabList.at(i).visible)
+ r = r.united(d->tabList.at(i).minRect);
+ }
return r.size().expandedTo(QApplication::globalStrut());
}
if (verticalTabs(d->shape))
@@ -1746,6 +1817,8 @@ void QTabBar::paintEvent(QPaintEvent *)
p.drawPrimitive(QStyle::PE_FrameTabBarBase, optTabBase);
for (int i = 0; i < d->tabList.count(); ++i) {
+ if (!d->at(i)->visible)
+ continue;
QStyleOptionTab tab;
initStyleOption(&tab, i);
if (d->paintWithOffsets && d->tabList[i].dragOffset != 0) {
@@ -1820,6 +1893,65 @@ void QTabBar::paintEvent(QPaintEvent *)
}
/*
+ When index changes visibility, we have to find first & last visible indexes.
+ If remove is set, we force both
+ */
+void QTabBarPrivate::calculateFirstLastVisible(int index, bool visible, bool remove)
+{
+ if (visible) {
+ firstVisible = qMin(index, firstVisible);
+ lastVisible = qMax(index, lastVisible);
+ } else {
+ if (remove || (index == firstVisible)) {
+ firstVisible = -1;
+ for (int i = 0; i < tabList.count(); ++i) {
+ if (tabList.at(i).visible) {
+ firstVisible = i;
+ break;
+ }
+ }
+ if (firstVisible < 0)
+ firstVisible = 0;
+ }
+ if (remove || (index == lastVisible)) {
+ lastVisible = -1;
+ for (int i = tabList.count() - 1; i >= 0; --i) {
+ if (tabList.at(i).visible) {
+ lastVisible = i;
+ break;
+ }
+ }
+ }
+ }
+}
+
+/*
+ Selects the new current index starting at "fromIndex". If "fromIndex" is visible we're done.
+ Else it tries any index AFTER fromIndex, then any BEFORE fromIndex and, if everything fails,
+ it returns -1 indicating that no index is available
+ */
+int QTabBarPrivate::selectNewCurrentIndexFrom(int fromIndex)
+{
+ int newindex = -1;
+ for (int i = fromIndex; i < tabList.count(); ++i) {
+ if (at(i)->visible && at(i)->enabled) {
+ newindex = i;
+ break;
+ }
+ }
+ if (newindex < 0) {
+ for (int i = fromIndex-1; i > -1; --i) {
+ if (at(i)->visible && at(i)->enabled) {
+ newindex = i;
+ break;
+ }
+ }
+ }
+
+ return newindex;
+}
+
+/*
Given that index at position from moved to position to where return where index goes.
*/
int QTabBarPrivate::calculateNewPosition(int from, int to, int index) const
diff --git a/src/widgets/widgets/qtabbar.h b/src/widgets/widgets/qtabbar.h
index fc619355f0..c49c12f38c 100644
--- a/src/widgets/widgets/qtabbar.h
+++ b/src/widgets/widgets/qtabbar.h
@@ -105,6 +105,9 @@ public:
bool isTabEnabled(int index) const;
void setTabEnabled(int index, bool);
+ bool isTabVisible(int index) const;
+ void setTabVisible(int index, bool);
+
QString tabText(int index) const;
void setTabText(int index, const QString &text);
diff --git a/src/widgets/widgets/qtabbar_p.h b/src/widgets/widgets/qtabbar_p.h
index 6f77579108..ac4cbd32a8 100644
--- a/src/widgets/widgets/qtabbar_p.h
+++ b/src/widgets/widgets/qtabbar_p.h
@@ -88,7 +88,7 @@ class Q_WIDGETS_EXPORT QTabBarPrivate : public QWidgetPrivate
Q_DECLARE_PUBLIC(QTabBar)
public:
QTabBarPrivate()
- :currentIndex(-1), pressedIndex(-1), shape(QTabBar::RoundedNorth), layoutDirty(false),
+ :currentIndex(-1), pressedIndex(-1), firstVisible(0), lastVisible(-1), shape(QTabBar::RoundedNorth), layoutDirty(false),
drawBase(true), scrollOffset(0), hoverIndex(-1), elideModeSetByUser(false), useScrollButtonsSetByUser(false), expanding(true), closeButtonOnTabs(false),
selectionBehaviorOnRemove(QTabBar::SelectRightTab), paintWithOffsets(true), movable(false),
dragInProgress(false), documentMode(false), autoHide(false), changeCurrentOnDrag(false),
@@ -97,6 +97,8 @@ public:
int currentIndex;
int pressedIndex;
+ int firstVisible;
+ int lastVisible;
QTabBar::Shape shape;
bool layoutDirty;
bool drawBase;
@@ -104,7 +106,7 @@ public:
struct Tab {
inline Tab(const QIcon &ico, const QString &txt)
- : enabled(true) , shortcutId(0), text(txt), icon(ico),
+ : enabled(true) , visible(true), shortcutId(0), text(txt), icon(ico),
leftWidget(nullptr), rightWidget(nullptr), lastTab(-1), dragOffset(0)
#if QT_CONFIG(animation)
, animation(nullptr)
@@ -112,6 +114,7 @@ public:
{}
bool operator==(const Tab &other) const { return &other == this; }
bool enabled;
+ bool visible;
int shortcutId;
QString text;
#ifndef QT_NO_TOOLTIP
@@ -170,6 +173,8 @@ public:
QList<Tab> tabList;
mutable QHash<QString, QSize> textSizes;
+ void calculateFirstLastVisible(int index, bool visible, bool remove);
+ int selectNewCurrentIndexFrom(int currentIndex);
int calculateNewPosition(int from, int to, int index) const;
void slide(int from, int to);
void init();
diff --git a/src/widgets/widgets/qtabwidget.cpp b/src/widgets/widgets/qtabwidget.cpp
index 28c91a89e7..f0bfe67e3a 100644
--- a/src/widgets/widgets/qtabwidget.cpp
+++ b/src/widgets/widgets/qtabwidget.cpp
@@ -544,8 +544,8 @@ bool QTabWidget::isTabEnabled(int index) const
}
/*!
- If \a enable is true, the page at position \a index is enabled; otherwise the page at position \a index is
- disabled. The page's tab is redrawn appropriately.
+ If \a enable is true, the page at position \a index is enabled; otherwise the page at
+ position \a index is disabled. The page's tab is redrawn appropriately.
QTabWidget uses QWidget::setEnabled() internally, rather than
keeping a separate flag.
@@ -566,6 +566,44 @@ void QTabWidget::setTabEnabled(int index, bool enable)
}
/*!
+ Returns true if the page at position \a index is visible; otherwise returns false.
+
+ \sa setTabVisible()
+ \since 5.15
+*/
+
+bool QTabWidget::isTabVisible(int index) const
+{
+ Q_D(const QTabWidget);
+ return d->tabs->isTabVisible(index);
+}
+
+/*!
+ If \a visible is true, the page at position \a index is visible; otherwise the page at
+ position \a index is hidden. The page's tab is redrawn appropriately.
+
+ \sa isTabVisible()
+ \since 5.15
+*/
+
+void QTabWidget::setTabVisible(int index, bool visible)
+{
+ Q_D(QTabWidget);
+ QWidget *widget = d->stack->widget(index);
+ bool currentVisible = d->tabs->isTabVisible(d->tabs->currentIndex());
+ d->tabs->setTabVisible(index, visible);
+ if (!visible) {
+ if (widget)
+ widget->setVisible(false);
+ } else if (!currentVisible) {
+ setCurrentIndex(index);
+ if (widget)
+ widget->setVisible(true);
+ }
+ setUpLayout();
+}
+
+/*!
\fn void QTabWidget::setCornerWidget(QWidget *widget, Qt::Corner corner)
Sets the given \a widget to be shown in the specified \a corner of the
@@ -848,7 +886,13 @@ QSize QTabWidget::sizeHint() const
QTabWidget *that = const_cast<QTabWidget*>(this);
that->setUpLayout(true);
}
- QSize s(d->stack->sizeHint());
+ QSize s;
+ for (int i=0; i< d->stack->count(); ++i) {
+ if (const QWidget* w = d->stack->widget(i)) {
+ if (d->tabs->isTabVisible(i))
+ s = s.expandedTo(w->sizeHint());
+ }
+ }
QSize t;
if (!d->isAutoHidden()) {
t = d->tabs->sizeHint();
diff --git a/src/widgets/widgets/qtabwidget.h b/src/widgets/widgets/qtabwidget.h
index f55e71488b..e6b3f93303 100644
--- a/src/widgets/widgets/qtabwidget.h
+++ b/src/widgets/widgets/qtabwidget.h
@@ -82,6 +82,9 @@ public:
bool isTabEnabled(int index) const;
void setTabEnabled(int index, bool);
+ bool isTabVisible(int index) const;
+ void setTabVisible(int index, bool);
+
QString tabText(int index) const;
void setTabText(int index, const QString &);
diff --git a/src/widgets/widgets/qtoolbarlayout.cpp b/src/widgets/widgets/qtoolbarlayout.cpp
index c95fa4ceee..93aded6876 100644
--- a/src/widgets/widgets/qtoolbarlayout.cpp
+++ b/src/widgets/widgets/qtoolbarlayout.cpp
@@ -360,6 +360,8 @@ void QToolBarLayout::updateMacBorderMetrics()
return;
QPlatformNativeInterface *nativeInterface = QApplication::platformNativeInterface();
+ if (!nativeInterface)
+ return; // Not Cocoa platform plugin.
QPlatformNativeInterface::NativeResourceForIntegrationFunction function =
nativeInterface->nativeResourceFunctionForIntegration("registerContentBorderArea");
if (!function)