Qt'粘合'两个小部件

时间:2016-01-03 01:14:20

标签: c++ qt qwidget qdockwidget qlayout

我有两个小部件(两个QFrames),它们都没有任何与之关联的标题栏(我通过setWindowFlags(Qt::FramelessWindowHint)实现)。其中一个是主要的小部件,另一个是侧边栏类型的小部件,它应该在其右边界(它的高度约为主要小部件的1/4)处坚持它。

我无法将它们保存在具有静态定位的透明QFrame中,因为主要窗口小部件可以通过其顶部拖动(因为标题栏上缺少标题栏,我通过拦截mousepress /来手动执行mousemove事件并相应地移动它。主窗口小部件上的自定义拖动工作正常,但是当我尝试移动侧边栏时,两者之间出现非常明显的视觉延迟,两者之间可以看到瞬间间隙,同时将主窗口小部件拖到左侧,或者将主窗口小部件向右拖动时两者之间的瞬间重叠(侧边栏不可拖动,没有为其实现拖动逻辑)。

如何将这两个小部件粘合在一起,以便它们一直移动到一起,没有任何延迟?我浏览了Qt文档,QDockWidget可能在这里有所帮助,但我无法理解。这里的主要小部件不是QMainWindow

平台 - OS X Yosemite,Qt 5.3.1,32位。

1 个答案:

答案 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...");
}