C++ QWidget/QWindow标题栏:定制外观,原生感觉(类似于Chrome)

C++ QWidget/QWindow标题栏:定制外观,原生感觉(类似于Chrome),c++,qt,qt4,qt5,window-managers,C++,Qt,Qt4,Qt5,Window Managers,我知道如何使QWidget(在Qt4或Qt5中)/QWindow(自Qt5起)无边界,绘制自定义标题栏并手动执行鼠标拖动以在屏幕上移动窗口,只需使用一些mouseMoveEvent跟踪鼠标位置并更新窗口位置即可 但是,此移动的行为不同于由窗口管理器实现的本机移动。例如,在屏幕边框附近移动窗口可以解释为“全屏”或“分屏”;或窗口捕捉到彼此的边框,具体取决于系统/窗口管理器。如果您像上面那样实现窗口移动,这些事情就不起作用了 Google Chrome/Chrome只是实现自定义窗口标题栏和边框的应

我知道如何使QWidget(在Qt4或Qt5中)/QWindow(自Qt5起)无边界,绘制自定义标题栏并手动执行鼠标拖动以在屏幕上移动窗口,只需使用一些
mouseMoveEvent
跟踪鼠标位置并更新窗口位置即可

但是,此移动的行为不同于由窗口管理器实现的本机移动。例如,在屏幕边框附近移动窗口可以解释为“全屏”或“分屏”;或窗口捕捉到彼此的边框,具体取决于系统/窗口管理器。如果您像上面那样实现窗口移动,这些事情就不起作用了

Google Chrome/Chrome只是实现自定义窗口标题栏和边框的应用程序的一个示例,同时仍然适应窗口管理器的本机行为。我想知道Chrome是否自己实现了这些功能(并检测窗口管理器及其配置),或者大多数窗口管理器(显然,这仍然高度依赖于平台)中是否有告诉“启动本机窗口移动”和“停止本机窗口移动”或类似的功能

在Qt中可能出现类似的情况吗?如果没有,可能使用其他库,比如Qxt


仅供参考:我主要针对Windows和Linux,我发现用户安装任何窗口管理器都有困难。

基于最近对Qt4的尝试,我担心答案是,您需要针对每个平台/每个窗口管理器对此进行调整。我希望QWindow的补丁可以改善这方面的行为,但我不知道有任何标准的钩子可以告诉OS/窗口管理器你想要实现什么


同样,Qt不应该“妨碍”解决这一问题,它只是一个它无法以一般方式帮助您的领域。

@Bぃ(编辑):这不是Qt5特有的。标题有误导性。这个问题是否与您的问题有关(至少在Windows中):@Roku非常好,非常感谢。我想这对Windows应该很有用。所以仍然在寻找一个在Linux下工作的解决方案。好的,对不起。我想我在你的照片上看到了qt5title@B是的,但特别是针对
QWindow
,因为它只是Qt5的一部分,与
QWidget
不同。但由于它具有误导性,我将其删除。