簡體   English   中英

如何在左側/右側顯示選項卡小部件角落小部件?

[英]How to display tab widget corner widget on the left/right side?

我有一個QTabWidget ,它的選項卡在West上,然后我嘗試向它添加一個角落小部件,但它沒有出現。 如果我將選項卡 position 設置為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()來檢查按鈕的下落,我點擊了整個小部件,但沒有得到 output。

QTabWidget::setCornerWidget :

注意:角落小部件專為北和南選項卡位置而設計; 已知其他方向無法正常工作。

我從中得到,讓它工作並非完全不可能。

有沒有辦法在側面獲得QTabWidget角落小部件?

從 Qt 文檔 (qt6) 中, QTabWidget::setCornerWidget:說:

注意:角落小部件專為北和南選項卡位置而設計; 已知其他方向無法正常工作。

這意味着它們確實有效,但使用起來很雜亂且不方便。

這是在側面使用QTabWidget角部件的一種方法:

正如問題中已經指出的那樣,在選項卡 position 是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

這是樣式表的示例:

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

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

擴展選項卡小部件角落小部件

建議: QTabWidget::paintEvent可能是更好的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM