0

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

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

我如何将这两个小部件“粘合”在一起,以便它们一直一起移动而没有任何延迟?我浏览了 Qt 文档,可能在QDockWidget这里可以提供帮助,但我不明白如何。这里的主要小部件不是QMainWindow.

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

4

1 回答 1

1

你绝对应该QDockWidget在这里使用。

让你的“主要小部件”派生自QMainWindow而不是QFrame(它可能不是“显而易见的”,因为QMainWindow不是派生自QFrame,但它不应该是什么大不了的事)。

然后,将您的第二个小部件封装在 aQDockWidget中并将其停靠在主小部件中,如下所示:

// 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 );

另一种方法是创建第三个小部件,它将成为您的顶级小部件,并使用 aQLayout将您的两个QFrames 插入到这个新的小部件中:

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 );
于 2016-01-03T09:35:19.580 回答