2011-02-24 136 views
17

我正在使用QDockWidgets並將其中的兩個放在我的應用程序的左側,以便可以使用選項卡在它們之間進行選擇。但是,Qt對此的默認行爲看起來很可怕,而且是不直觀的。而不是能夠拖動選項卡來移動小部件,它會在選定選項卡(具有相同名稱)下方放置另一個欄,而該欄必須被拖動。作爲用戶,很難弄清楚這一點。QDockWidget可拖拽選項卡

enter image description here

(我QDockWidgets是「屬性」和「庫」)

有沒有辦法擺脫這種第二條,並使它這樣我可以通過拖動標籤本身將我QDockWidgets ?

回答

0

你嘗試過:

myDockingWidget->setTitleBarWidget(0) 

編輯:

QWidget* titleWidget = new QWidget(this); 
    mUi.dockWidget->setTitleBarWidget(titleWidget); 

其中 '這' 是的QMainWindow

這將刪除標題欄,但林不知道如何使QDockWidget可以從選項卡拖動

+0

我不認爲這有效。至少不是我最後一次嘗試它。 :)標題欄小部件僅在浮動小部件浮動時使用。 – 2011-02-24 16:06:56

+0

這什麼都不做。這個函數的Qt文檔甚至會說它只會讓它回到默認的標題欄小部件。我可以將它設置爲我自己的0高度小部件,但即使如此,選項卡也不會拖動。 – Dwayne 2011-02-24 18:37:34

0

它看起來像您已將您的碼頭選項卡位置設置在頂部。默認值是它在底部。然後,在標題欄文本旁邊顯示標籤文本並不是視覺上的震撼。

我不認爲有什麼辦法可以做到你在Qt中提出的建議(消除QDockWidget標題欄並從標籤中拖拽),至少不要使用標準的小部件。你可能會寫很多自定義代碼來實現它,但這可能不值得。

相反,我建議將標籤移到底部(請參閱QMainWindow::setTabPosition)或可能是其中一面。

3

我想,湯姆是不是太遠瞭解決方案:

你可以設置自己的窗口小部件的標題欄:

myDockingWidget->setTitleBarWidget(myTitleBar) 

如果你設計這個小部件不顯示停靠窗口標題, 你擁有了它。通過信號QDockWidget::topLevelChanged,您的對接小部件甚至可以變得通知,當它浮動時,您可以再次啓用myTitleBar中的標題。

+2

這不起作用,它會從示例中刪除文本「庫」,但仍然無法讓選項卡的鼠標事件變爲可拖動狀態。 – paulm 2013-02-10 00:18:18

2

據我可以從QDockWidget::mousePressEvent實施src/gui/widgets/qdockwidget.cpp看到使用標籤拖動dockwidgets是可能:

QDockWidgetLayout *dwLayout 
    = qobject_cast<QDockWidgetLayout*>(layout); 

if (!dwLayout->nativeWindowDeco()) { 
    QRect titleArea = dwLayout->titleArea(); 

    if (event->button() != Qt::LeftButton || 
     !titleArea.contains(event->pos()) || 
     // check if the tool window is movable... do nothing if it 
     // is not (but allow moving if the window is floating) 
     (!hasFeature(this, QDockWidget::DockWidgetMovable) && !q->isFloating()) || 
     qobject_cast<QMainWindow*>(parent) == 0 || 
     isAnimating() || state != 0) { 
     return false; 
    } 

    initDrag(event->pos(), false); 
    .... 

你可以從實現中看到的事情之一,允許前QDockWidget檢查脫離是否鼠標按下事件是否來自標題欄。

+0

是否可以對窗口小部件進行子類化,並重寫此行爲,並說明是否(相對?)光標座標包含在標籤矩形內? – Ehouarn 2015-12-22 11:55:43

4

如果您將QTabWidgets添加到衍生自QMainWindow的主窗口,則可以嘗試tabifyDockWidget。 它像你想要的那樣列出兩個QDockWidgets,當然你可以拖動它們。

dockWidget1 = new QDockWidget("Tab1") ; 
dockWidget2 = new QDockWidget("Tab2") ; 
this->addDockWidget(Qt::LeftDockWidgetArea , dockWidget1); 
this->addDockWidget(Qt::LeftDockWidgetArea , dockWidget2); 
this->tabifyDockWidget(dockWidget1,dockWidget2); 
0

我也認爲setTitleBarWidget()真的有竅門。我記得在Amarok music player的源代碼中看到它被用於類似的目的。 Amarok有一個只包含Dock小部件的QMainWindow。你可能想看看那裏的源代碼。