我有一个
QTabWidget
,其选项卡位于 West 上,然后我尝试向其添加一个角小部件,但它没有出现。如果我将选项卡位置设置为 North 或 South,则会显示角小部件,但不会显示在侧面。
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()
来检查按钮的位置,我单击了整个小部件,但没有得到任何输出。
注意:角小部件是为北和南选项卡位置设计的;已知其他方向无法正常工作。
我从中得知,让它发挥作用并非完全不可能。
来自 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 可能是更好的解决方案。