Qt将两个小部件“粘合”在一起
Posted
技术标签:
【中文标题】Qt将两个小部件“粘合”在一起【英文标题】:Qt 'glue' two widgets together 【发布时间】:2016-01-03 01:14:19 【问题描述】:我有两个小部件(都是QFrames
),它们都没有与之关联的任何标题栏(我通过setWindowFlags(Qt::FramelessWindowHint)
实现)。其中一个是主窗口小部件,另一个是侧边栏类型的窗口小部件,它应该贴在它的右边界(它的高度大约是主窗口小部件的 1/4)。
我不能将它们都保持在具有静态定位的透明QFrame
中,因为主小部件可以通过其顶部拖动(因为它缺少标题栏,我通过拦截mousepress
/mousemove
事件手动完成并相应地移动它)。主小部件上的自定义拖动工作正常,但是当我尝试同时移动侧边栏时,两者之间会出现非常明显的视觉延迟,将主小部件向左拖动时两者之间会出现短暂的间隙,或者向右拖动主小部件时两者之间的瞬间重叠(侧边栏不可拖动,没有为其实现拖动逻辑)。
如何将这两个小部件“粘合”在一起,以使它们一直一起移动而不会有任何延迟?我浏览了 Qt 文档,QDockWidget
可能会在这里提供帮助,但我不明白如何。这里的主要小部件不是QMainWindow
。
平台 - OS X Yosemite,Qt 5.3.1,32 位。
【问题讨论】:
【参考方案1】:你绝对应该在这里使用QDockWidget
。
让您的“主要小部件”派生自 QMainWindow
而不是 QFrame
(它可能不是“显而易见的”,因为 QMainWindow
不是派生自 QFrame
,但它应该不是什么大问题)。
然后,将您的第二个小部件封装在 QDockWidget
中并将其停靠在主小部件中,如下所示:
// secondWidget being your QFrame based widget
// mainWidget being your "main widget"
QDockWidget* dockingBar = new QDockWidget("My bar", mainWidget );
dockingBar->setWidget( secondWidget );
// dock on left side, change first parameter to dock somewhere else:
mainWidget->addDockWidget( Qt::LeftDockWidgetArea, dockingBar );
另一种方法是创建第三个小部件,它将成为您的***小部件,并使用 QLayout
将您的两个 QFrame
s 插入到这个新的小部件中:
QWidget* newTopLevelWidget = new QWidget();
// QHBoxLayout to have mainWidget on the left hand side of secondWidget
// Replace by QVBoxLayout to have mainWidget on top of secondWidget
QLayout* layout = new QHBoxLayout( newTopLevelWidget );
layout->addWidget( mainWidget );
layout->addWidget( secondWidget );
【讨论】:
谢谢。将其设为QMainWindow
会带走我可以对QFrame
执行的任何属性,例如删除标题栏、使其可拖动、使用半透明背景属性等仅使用图像作为背景?以及如何粘贴侧边栏?通过addDockWidget
添加停靠小部件会自动粘合它们吗?第一个参数不应该是RightDockingArea
,因为主小部件在左侧,侧边栏在右侧?
是的,试试RightDockingArea
,你会看到完成后的样子,它们会粘在一起。但用户仍然可以选择取消停靠小部件。使用我提出的替代解决方案,用户无法“解开”小部件。
但正如我在第二段中所说的那样,该解决方案是不可行的,因为我需要使主小部件和侧边栏一起移动。将它们放在父小部件中如何实现这一点?用户如何取消它们?我将通过setWindowFlags(Qt::FramelessWindowHint)
删除取消/关闭按钮。那么,用户将如何取消停靠侧边栏呢?
将它们放在父窗口小部件中将使它们粘合在一起并在父窗口移动时一起移动。这是让两个小部件彼此相邻的最简单方法。以上是关于Qt将两个小部件“粘合”在一起的主要内容,如果未能解决你的问题,请参考以下文章
Qt 表小部件。如何一起设置垂直标题和水平标题的含义/标题?