我有两个小部件(两个QFrames
),它们都没有任何与之关联的标题栏(我通过setWindowFlags(Qt::FramelessWindowHint)
实现)。其中一个是主要的小部件,另一个是侧边栏类型的小部件,它应该在其右边界(它的高度约为主要小部件的1/4)处坚持它。
我无法将它们保存在具有静态定位的透明QFrame
中,因为主要窗口小部件可以通过其顶部拖动(因为标题栏上缺少标题栏,我通过拦截mousepress
/来手动执行mousemove
事件并相应地移动它。主窗口小部件上的自定义拖动工作正常,但是当我尝试移动侧边栏时,两者之间出现非常明显的视觉延迟,两者之间可以看到瞬间间隙,同时将主窗口小部件拖到左侧,或者将主窗口小部件向右拖动时两者之间的瞬间重叠(侧边栏不可拖动,没有为其实现拖动逻辑)。
如何将这两个小部件粘合在一起,以便它们一直移动到一起,没有任何延迟?我浏览了Qt文档,QDockWidget
可能在这里有所帮助,但我无法理解。这里的主要小部件不是QMainWindow
。
平台 - OS X Yosemite,Qt 5.3.1,32位。
答案 0 :(得分: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
在这个新小部件中插入两个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 );
:
var newWindow = window.open("url");
newWindow.onload = function (newWindow) {
newWindow.console.log("...something...");
}