2011-02-24 141 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。你可能想看看那里的源代码。