c++ 如何在左侧/右侧显示标签小部件角落小部件?

zc0qhyus  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(200)

我有一个QTabWidget,它的标签在West上,然后我试图向它添加一个角落小部件,但它没有出现。如果我将选项卡位置设置为NorthSouth,则会显示角落小部件,但不会显示在侧面。
这是一个MRE:

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:
注意:角部件是为南北标签位置设计的;已知其它取向不能正常工作。
我从中得到的,这不是完全不可能得到它的工作。
有没有办法在侧面得到一个QTabWidget角部件?

yhived7q

yhived7q1#

在Qt文档(qt 6)中,QTabWidget::setCornerWidget:说:
注意:角部件是为南北标签位置设计的;已知其它取向不能正常工作。
这意味着他们做的工作,但混乱和不方便使用。
下面是一种在侧面使用QTabWidget角部件的方法:
正如问题中已经提到的,当标签位置为WestEast时,设置一个角落小部件会导致标签前出现一个小间隙,而没有任何东西出现在那里。
但是如果你设置了QTabWidget的角落小部件最小尺寸,它就会出现,这解决了一个问题,但又引起了另一个问题,因为现在我需要自己计算那个尺寸,或者为我的角落小部件腾出空间。
这是一个MRE,我用来尝试并计算如何获得空角大小:

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());

//checking related widgets geometries
/*qDebug()<<"cornerWidget geo"<<t->cornerWidget(Qt::TopLeftCorner)->geometry();
qDebug()<<"tabBar rect"<<t->tabBar()->tabRect(0);
qDebug()<<"tabBar geo"<<t->tabBar()->geometry();
qDebug()<<"stackwidget geo"<<sw->geometry();*/

下面是它的外观,我使用了自定义图标:

如果你需要更多的空间来放置角落小部件,你需要移动标签栏,因为角落小部件会覆盖它,你可以使用样式表来完成。Qt样式表示例:自定义QTabWidget和QTabBar。
下面是一个stylesheet的例子:

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

以下是它的外观,这是我的MRE的唯一添加和更改:

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

相关问题