Qt 'glue' 两个widgets在一起
Qt 'glue' two widgets together
我有两个小部件(都是 QFrames
),其中 none 有与之关联的任何标题栏(我通过 setWindowFlags(Qt::FramelessWindowHint)
实现)。其中一个是主小部件,另一个是侧边栏小部件,应该在它的右边界处粘在它上面(它的高度大约是主小部件的 1/4)。
我不能将它们都保持在透明的 QFrame
中并进行静态定位,因为主要的小部件可以通过其顶部拖动(因为它上面缺少标题栏,我通过拦截 mousepress
/mousemove
事件并相应地移动它)。主小部件上的自定义拖动效果很好,但是当我尝试一起移动侧边栏时,两者之间出现非常明显的视觉延迟,将主小部件向左拖动时两者之间会出现短暂的间隙,或者向右拖动主小部件时两者之间的瞬间重叠(侧边栏不可拖动,没有为其实现拖动逻辑)。
如何 'glue' 将这两个小部件放在一起,以便它们始终一起移动,没有任何延迟?我浏览了 Qt 文档,QDockWidget
可能会在这里提供帮助,但我不明白如何做。这里的主要小部件不是 QMainWindow
.
平台 - OS X Yosemite,Qt 5.3.1,32 位。
你绝对应该在这里使用 QDockWidget
。
让你的 "main widget" 派生自 QMainWindow
而不是 QFrame
(它可能不是 "obvious" 因为 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 );
另一种方法是创建第三个小部件,它将成为您的 top-level 小部件,并使用 QLayout
将您的两个 QFrame
插入到这个新小部件中:
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 );
我有两个小部件(都是 QFrames
),其中 none 有与之关联的任何标题栏(我通过 setWindowFlags(Qt::FramelessWindowHint)
实现)。其中一个是主小部件,另一个是侧边栏小部件,应该在它的右边界处粘在它上面(它的高度大约是主小部件的 1/4)。
我不能将它们都保持在透明的 QFrame
中并进行静态定位,因为主要的小部件可以通过其顶部拖动(因为它上面缺少标题栏,我通过拦截 mousepress
/mousemove
事件并相应地移动它)。主小部件上的自定义拖动效果很好,但是当我尝试一起移动侧边栏时,两者之间出现非常明显的视觉延迟,将主小部件向左拖动时两者之间会出现短暂的间隙,或者向右拖动主小部件时两者之间的瞬间重叠(侧边栏不可拖动,没有为其实现拖动逻辑)。
如何 'glue' 将这两个小部件放在一起,以便它们始终一起移动,没有任何延迟?我浏览了 Qt 文档,QDockWidget
可能会在这里提供帮助,但我不明白如何做。这里的主要小部件不是 QMainWindow
.
平台 - OS X Yosemite,Qt 5.3.1,32 位。
你绝对应该在这里使用 QDockWidget
。
让你的 "main widget" 派生自 QMainWindow
而不是 QFrame
(它可能不是 "obvious" 因为 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 );
另一种方法是创建第三个小部件,它将成为您的 top-level 小部件,并使用 QLayout
将您的两个 QFrame
插入到这个新小部件中:
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 );