如何在左侧/右侧显示选项卡小部件的角小部件

问题描述 投票:0回答:1

我有一个

QTabWidget
,其选项卡位于 West 上,然后我尝试向其添加一个角小部件,但它没有出现。如果我将选项卡位置设置为 NorthSouth,则会显示角小部件,但不会显示在侧面。

QWidget *w = new QWidget();
QTabWidget *t = new QTabWidget(w);

w->setMinimumSize(800,600);

t->addTab(new QWidget(),"Tab");
t->addTab(new QWidget(),"Tab");
t->addTab(new QWidget(),"Tab");
t->addTab(new QWidget(),"Tab");

t->setTabPosition(QTabWidget::TabPosition::East);

t->setGeometry(100,100,400,400);

QPushButton *button = new QPushButton("Button");

//for debugging purposes
button->setObjectName("ss");

//for debugging purposes
t->setStyleSheet("background: red");
button->setStyleSheet("background: blue;");

//for debugging purposes
t->setCornerWidget(button1,Qt::TopLeftCorner);
//t->setCornerWidget(button1,Qt::TopRightCorner);
//t->setCornerWidget(button1,Qt::BottomLeftCorner);
//t->setCornerWidget(button1,Qt::BottomRightCorner);
    
w->show();

//for debugging purposes
//qDebug()<<button->geometry();
//button->setGeometry(0,0,50,50);

//for debugging purposes
button->connect(button,&QPushButton::clicked,[](){qDebug()<<"corner widget click?";});

我尝试使用所有 4 个角,右上角没有任何效果,但是左侧导致选项卡之前有一个空白,如下所示,空白位于右上角:

我尝试设置用作角小部件的按钮的样式表,以便它在隐藏时可能会出现,但没有结果。

我检查了按钮的几何形状,它得到了

QRect(0,0 0x0)
,这是在使用
show()
之后。所以我尝试设置它的几何形状,但也没有结果(但几何形状已正确更新),按钮仍然不显示。

我还尝试通过将其

clicked()
信号连接到
qDebug()
来检查按钮的位置,我单击了整个小部件,但没有得到任何输出。

QTabWidget::setCornerWidget:

注意:角小部件是为北和南选项卡位置设计的;已知其他方向无法正常工作。

我从中得知,让它发挥作用并非完全不可能。

c++ qt qwidget qt6 qtabwidget
1个回答
0
投票

来自 Qt 文档 (qt6),QTabWidget::setCornerWidget: 说:

注意:角小部件是为北和南选项卡位置设计的;已知其他方向无法正常工作。

这意味着它们确实有效,但使用起来很混乱且不方便。

这是使用侧面

QTabWidget
角小部件的方法:

正如问题中已经指出的,在选项卡位置为

West
East
时设置角小部件,会导致选项卡之前出现一个小间隙,而不会出现任何内容。

但是,如果您设置

QTabWidget
的角部件最小尺寸,它就会出现,这解决了一个问题,但又导致了另一个问题,因为现在我需要自己计算该尺寸,或者为我的角部件腾出空间。

QTabWidget *t = new QTabWidget();

//I needed the stacked widget so I can use its geometry to calculate the empty corner size
QStackedWidget *stack_widget = t->findChild<QStackedWidget*>("qt_tabwidget_stackedwidget");
t->setMinimumSize(800,600);
t->addTab(new QWidget(),"Tab1");
t->addTab(new QWidget(),"Tab2");
t->addTab(new QWidget(),"Tab3");
t->addTab(new QWidget(),"Tab4");
t->setTabPosition(QTabWidget::TabPosition::West);

QToolButton *button1 = new QToolButton();
button1->setIcon(QIcon(":/icons/collapse.png"));

t->setCornerWidget(button1,Qt::TopLeftCorner);

t->show();
    
//width is equal to where the stack widget starts (x coordinate)
//height is equal to where the tab bar starts (y coordinate)
//I subtracted 1 from stackwidget's x because it simply looked better
t->cornerWidget(Qt::TopLeftCorner)->setMinimumSize(stack_widget->geometry().x()-1,
                                                   t->tabBar()->geometry().y());

如果您需要更多空间用于角小部件,则需要移动选项卡栏,因为角小部件将覆盖它,您可以使用样式表来做到这一点。

参见:Qt 样式表示例:自定义 QTabWidget 和 QTabBar

示例:

t->setStyleSheet("QTabWidget::tab-bar "
                 "{"
                     "top: 50px;" /* push down by 50px */
                 "}");

这是我的 MRE 的唯一添加和更改:


建议: QTabWidget::paintEvent 可能是更好的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.