我正在使用QDockWidgets並將其中的兩個放在我的應用程序的左側,以便可以使用選項卡在它們之間進行選擇。但是,Qt對此的默認行爲看起來很可怕,而且是不直觀的。而不是能夠拖動選項卡來移動小部件,它會在選定選項卡(具有相同名稱)下方放置另一個欄,而該欄必須被拖動。作爲用戶,很難弄清楚這一點。QDockWidget可拖拽選項卡
(我QDockWidgets是「屬性」和「庫」)
有沒有辦法擺脫這種第二條,並使它這樣我可以通過拖動標籤本身將我QDockWidgets ?
我正在使用QDockWidgets並將其中的兩個放在我的應用程序的左側,以便可以使用選項卡在它們之間進行選擇。但是,Qt對此的默認行爲看起來很可怕,而且是不直觀的。而不是能夠拖動選項卡來移動小部件,它會在選定選項卡(具有相同名稱)下方放置另一個欄,而該欄必須被拖動。作爲用戶,很難弄清楚這一點。QDockWidget可拖拽選項卡
(我QDockWidgets是「屬性」和「庫」)
有沒有辦法擺脫這種第二條,並使它這樣我可以通過拖動標籤本身將我QDockWidgets ?
你嘗試過:
myDockingWidget->setTitleBarWidget(0)
編輯:
QWidget* titleWidget = new QWidget(this);
mUi.dockWidget->setTitleBarWidget(titleWidget);
其中 '這' 是的QMainWindow
這將刪除標題欄,但林不知道如何使QDockWidget可以從選項卡拖動
它看起來像您已將您的碼頭選項卡位置設置在頂部。默認值是它在底部。然後,在標題欄文本旁邊顯示標籤文本並不是視覺上的震撼。
我不認爲有什麼辦法可以做到你在Qt中提出的建議(消除QDockWidget
標題欄並從標籤中拖拽),至少不要使用標準的小部件。你可能會寫很多自定義代碼來實現它,但這可能不值得。
相反,我建議將標籤移到底部(請參閱QMainWindow::setTabPosition
)或可能是其中一面。
我想,湯姆是不是太遠瞭解決方案:
你可以設置自己的窗口小部件的標題欄:
myDockingWidget->setTitleBarWidget(myTitleBar)
如果你設計這個小部件不顯示停靠窗口標題, 你擁有了它。通過信號QDockWidget::topLevelChanged
,您的對接小部件甚至可以變得通知,當它浮動時,您可以再次啓用myTitleBar
中的標題。
這不起作用,它會從示例中刪除文本「庫」,但仍然無法讓選項卡的鼠標事件變爲可拖動狀態。 – paulm 2013-02-10 00:18:18
據我可以從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
檢查脫離是否鼠標按下事件是否來自標題欄。
是否可以對窗口小部件進行子類化,並重寫此行爲,並說明是否(相對?)光標座標包含在標籤矩形內? – Ehouarn 2015-12-22 11:55:43
如果您將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);
我也認爲setTitleBarWidget()
真的有竅門。我記得在Amarok music player的源代碼中看到它被用於類似的目的。 Amarok有一個只包含Dock小部件的QMainWindow。你可能想看看那裏的源代碼。
我不認爲這有效。至少不是我最後一次嘗試它。 :)標題欄小部件僅在浮動小部件浮動時使用。 – 2011-02-24 16:06:56
這什麼都不做。這個函數的Qt文檔甚至會說它只會讓它回到默認的標題欄小部件。我可以將它設置爲我自己的0高度小部件,但即使如此,選項卡也不會拖動。 – Dwayne 2011-02-24 18:37:34