我在 Windows 上使用 QDockWidgets 编写了一个 PyQt5 程序。在中央小部件的 QList 中选择项目会导致小部件被放置在右侧的停靠区域中,这允许我编辑该项目,并且当我在 QList 中选择不同的项目时,小部件会被替换。如果我将停靠小部件移动到浮动小部件或不同的停靠区域,然后选择一个新项目,则右侧停靠区域将获得一个新的小部件,并且我弹出的停靠小部件仍然存在。这正是我想要的行为。
然后我在 Ubuntu 上运行这个程序,如果我将停靠窗口小部件移动到浮动窗口小部件中,然后选择一个新项目,这会导致浮动停靠窗口小部件消失。如果我将扩展坞小部件移到另一个扩展坞中并将其留在那里或将其移到浮动扩展坞中,那么它将像在 Windows 上一样持续存在。
我正在维护停靠小部件及其停靠位置的列表,每次打开新的停靠小部件时,我都会在右侧停靠区域中查找小部件并将其删除。我使用 QDockWidget 的子类维护此列表,该子类监听dockLocationChanged 来跟踪不断变化的停靠位置。在 Ubuntu 上,从停靠状态转换为浮动状态时,该信号似乎不会触发。因此,在我的停靠小部件数据库 -> 停靠区域中,从右侧区域弹出的任何小部件都被列为停靠在右侧区域,并在我在列表中选择新项目时被删除。
我像这样修复了它:
DOCK_AREAS = {
'right': Qt.DockWidgetArea.RightDockWidgetArea,
'left': Qt.DockWidgetArea.LeftDockWidgetArea,
'top': Qt.DockWidgetArea.TopDockWidgetArea,
'bottom': Qt.DockWidgetArea.BottomDockWidgetArea,
'': Qt.DockWidgetArea.NoDockWidgetArea
}
INVERSE_DOCK_AREAS = {v[1]: v[0] for v in DOCK_AREAS.items()}
...SNIP...
def on_dock(area):
text = INVERSE_DOCK_AREAS.get(area, '')
self.config['dock_area'] = text
+
+ def on_float(floating):
+ if floating:
+ on_dock(Qt.DockWidgetArea.NoDockWidgetArea)
+
self.dockLocationChanged.connect(on_dock)
+ self.topLevelChanged.connect(on_float)