我正在使用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