wangwenx190 / framelesshelper

Project moved to: https://github.com/stdware/qwindowkit Cross-platform window customization framework for Qt Widgets and Qt Quick. Supports Windows, Linux and macOS.
MIT License
846 stars 203 forks source link

双屏幕问题 #275

Open ohPigFly opened 1 year ago

ohPigFly commented 1 year ago

如下图,当Dialog从屏幕1拉到屏幕2,ok按键就会点击不了。 image 如下图,使用Demo-dialog,则需要在屏幕1时候,点击more,让展开到最大。 image 如下图,当展开到最大,拖动到屏幕2,就会出现折叠了,底部的Search selection就那个部分就不能点击了。 image 如下图,虽然点击more,可以刷新一下,正常可点击,但是底部会出现了白条,感觉是按照了屏幕1时候的大小来设置了。 image

如果dialog是没有重新变大变小,就会最底下按钮都会点击不了。我的环境是,屏幕1是19201080,屏幕2是25601080的,两个屏幕的缩放是设置一样的。

ohPigFly commented 1 year ago

mainwindow也有类似的问题。如下图,屏幕1拖动到屏幕2。 image 如下图,再从屏幕2拖动会屏幕1,变化大小,底栏的白色区域就一直存在。 image

wangwenx190 commented 1 year ago

最新代码还有这个问题吗

ohPigFly commented 1 year ago

image 这个版本测出来的,#276也是同一个版本。

wangwenx190 commented 1 year ago

拉取最新代码试试呢

ohPigFly commented 1 year ago

还是有,但是可恢复,变化一下大小就会恢复了。

ohPigFly commented 1 year ago

我之前参考那种隐藏标题栏写一个简单的自用,也遇到这个类似的问题,下面就多了一截出来,不过我的还多了个标题栏触摸下移了一个标题栏的高度,需要变化一下大小才可以恢复,但是有时候一些固定的框,不能变化大小。我把大小拿出来,会发现第一次移动到屏幕2,大小会变大了一点,大佬有方向么?我也很好奇这个问题。

wangwenx190 commented 1 year ago

我之前参考那种隐藏标题栏写一个简单的自用,也遇到这个类似的问题,下面就多了一截出来,不过我的还多了个标题栏触摸下移了一个标题栏的高度,需要变化一下大小才可以恢复,但是有时候一些固定的框,不能变化大小。我把大小拿出来,会发现第一次移动到屏幕2,大小会变大了一点,大佬有方向么?我也很好奇这个问题。

这个问题讲起来有些复杂。总之你观察到的现象是Qt的bug,Qt算错了窗口尺寸。

ohPigFly commented 1 year ago

那现在暂时还没办法能规避掉么?

wangwenx190 commented 1 year ago

@ohPigFly 你是指FramelessHelper还是说你自己的项目?

ohPigFly commented 1 year ago

FramelessHelper或者说可以在自己的项目有方法规避都可以

wangwenx190 commented 1 year ago

FramelessHelper应该是处理了,不会有这个问题。核心做法是每次切换屏幕都要去更新QWindow的custom margins,并且手动触发一次窗口resize。具体请参考:https://github.com/wangwenx190/framelesshelper/blob/main/src/core/utils_win.cpp#L1172

ohPigFly commented 1 year ago

意思是更改一下FramelessmainWindow,当每次切换屏幕,都要去调用一下Utils::updateInternalWindowFrameMargins么?

wangwenx190 commented 1 year ago

意思是更改一下FramelessmainWindow,当每次切换屏幕,都要去调用一下Utils::updateInternalWindowFrameMargins么?

最新代码里已经处理过了,FramelessHelper这边不需要额外改动了。你如果搞了自己的自定义边框,就需要检测屏幕是否改变,改变就要参考我那个函数的做法,更新Qt内部的custom margins

ohPigFly commented 1 year ago

我更新最新代码,是可以了。但是就是会闪一下黑边。 d8325b6e3e1861ddda2bcc9b4b53dfe

还有最新代码CMake configuring的时候报这个警告,有影响么? 76106e46563b20bbd11b3190e9eb590

ohPigFly commented 1 year ago

更新后还发现了一个问题就是,我在使用8月份的时候代码还没问题,更新最新版本就会崩溃。 我继承FramelessDialog去封装一个MessageBox,使用了QDialogButtonBox,然后通过QDialogButtonBox里的按键触发会导致了崩溃,按键没有去触发FramelessDialog的closeEvent的事件,但是在使用8月份时候的代码没有崩溃问题。 使用顶栏的关闭按钮就不会出现崩溃的。 image image

wangwenx190 commented 1 year ago

一、黑边问题我马上解决下,小问题 二、cmake警告忽略就行,是没有设置版本号的第四位导致的 三、崩溃步骤能详细描述下吗,怎么触发的崩溃?我看你堆栈好像是窗口关闭时遇到问题

ohPigFly commented 1 year ago

1.设置版本号是如何设置? 2.这个崩溃导致,是我仿照原生封装一个MessageBox,然后用到了QDialogButtonBox。你看一下下面能大概看懂不?使用yes或者no都会导致崩溃。我的CutomDialog是继承你的FramelessDialog的,里面只是预先先设置的顶栏的颜色统一起来,其他都一样。 image image image image

wangwenx190 commented 1 year ago

一、是我没有设置FramelessHelper的第四位版本号,不是你那边的问题,你直接忽略这个警告就可以了,没有任何实质问题 二、黑边问题现在应该非常不明显了,麻烦测试一下 三、崩溃问题是我重构造成的,现在应该也解决了,麻烦测试一下

ohPigFly commented 1 year ago

1.黑边问题我要周一再验证一下,我现在没双屏幕。 2.奔溃的问题暂时没了,我会持续再关注;但是出现了这种问题,我在没有弹出过FramelessDialog的情况下,FramelessMainWindow在变化大小不会出现问题;在我弹出了FramelessDialog后,隐藏了,FramelessMainWindow在变化大小就会出现下图的问题。 image 3.在更新版本后,FramelesMainWindow启动时候会报下图这个警告,我之前自己项目遇见类似这种警告,界面就会出现奇奇怪怪的绘图问题的了,问题2的和这个会不会有关联。 image

ohPigFly commented 1 year ago

1.测过了,现在没有黑边问题了,就是会慢了一点,先闪一下下图的,大概有差不多1秒左右,才会恢复,这个有没有优化空间? 2.如果不限定大小的话,来回拖动,就会越变越小。 image

wangwenx190 commented 1 year ago

1.黑边问题我要周一再验证一下,我现在没双屏幕。 2.奔溃的问题暂时没了,我会持续再关注;但是出现了这种问题,我在没有弹出过FramelessDialog的情况下,FramelessMainWindow在变化大小不会出现问题;在我弹出了FramelessDialog后,隐藏了,FramelessMainWindow在变化大小就会出现下图的问题。 image 3.在更新版本后,FramelesMainWindow启动时候会报下图这个警告,我之前自己项目遇见类似这种警告,界面就会出现奇奇怪怪的绘图问题的了,问题2的和这个会不会有关联。 image

第二个问题,我看截图是我自带的例子,意思是能用我自带的例子触发这个bug?你有修改什么地方吗,还是说用原版例子就可以? 问题3你不用担心,我内部已经处理的比较到位了,一般不会遇到绘图问题。这个警告也跟Qt版本有关,之前我很长时间没遇到了

wangwenx190 commented 1 year ago

1.测过了,现在没有黑边问题了,就是会慢了一点,先闪一下下图的,大概有差不多1秒左右,才会恢复,这个有没有优化空间? 2.如果不限定大小的话,来回拖动,就会越变越小。 image

问题1:时间可以缩短,应该可以进一步优化体验 问题2:来回拖动,是指两个屏幕之间来回拖动吗?用我原版的例子能复现吗?你Qt用的哪个版本?

ohPigFly commented 1 year ago

1.黑边问题我要周一再验证一下,我现在没双屏幕。 2.奔溃的问题暂时没了,我会持续再关注;但是出现了这种问题,我在没有弹出过FramelessDialog的情况下,FramelessMainWindow在变化大小不会出现问题;在我弹出了FramelessDialog后,隐藏了,FramelessMainWindow在变化大小就会出现下图的问题。 image 3.在更新版本后,FramelesMainWindow启动时候会报下图这个警告,我之前自己项目遇见类似这种警告,界面就会出现奇奇怪怪的绘图问题的了,问题2的和这个会不会有关联。 image

第二个问题,我看截图是我自带的例子,意思是能用我自带的例子触发这个bug?你有修改什么地方吗,还是说用原版例子就可以? 问题3你不用担心,我内部已经处理的比较到位了,一般不会遇到绘图问题。这个警告也跟Qt版本有关,之前我很长时间没遇到了

你的Demo应该要改一下才可以复现,必须要在使用FramelessMainWindow的时候,也使用一下FramelessDilog,我在关闭软件时候是会用FramelessDilog来做了个提示框。如果我没有去弹出过这个提示框,FramelessMainWindow就不会出现问题,如果弹过之后,就会出现这个问题。

ohPigFly commented 1 year ago

1.测过了,现在没有黑边问题了,就是会慢了一点,先闪一下下图的,大概有差不多1秒左右,才会恢复,这个有没有优化空间? 2.如果不限定大小的话,来回拖动,就会越变越小。 image

问题1:时间可以缩短,应该可以进一步优化体验 问题2:来回拖动,是指两个屏幕之间来回拖动吗?用我原版的例子能复现吗?你Qt用的哪个版本?

是的,就是在两个屏幕之间来回拖动,屏幕1拖动到屏幕2,需要放开鼠标停顿大概1秒,再点击拖动到另外一个屏幕。我这里不会变化,是因为设置了最小边框大小,demo没有去设置,就会上下高度越来越窄。我用的是Qt5.15.2。

wangwenx190 commented 1 year ago

窗口越来越小是Qt的bug,好像6.2还是6.4才修复,但我记得我代码里也有workaround,按理说不应该发生了。我需要再检查一下

wangwenx190 commented 1 year ago

1.黑边问题我要周一再验证一下,我现在没双屏幕。 2.奔溃的问题暂时没了,我会持续再关注;但是出现了这种问题,我在没有弹出过FramelessDialog的情况下,FramelessMainWindow在变化大小不会出现问题;在我弹出了FramelessDialog后,隐藏了,FramelessMainWindow在变化大小就会出现下图的问题。 image 3.在更新版本后,FramelesMainWindow启动时候会报下图这个警告,我之前自己项目遇见类似这种警告,界面就会出现奇奇怪怪的绘图问题的了,问题2的和这个会不会有关联。 image

第二个问题,我看截图是我自带的例子,意思是能用我自带的例子触发这个bug?你有修改什么地方吗,还是说用原版例子就可以? 问题3你不用担心,我内部已经处理的比较到位了,一般不会遇到绘图问题。这个警告也跟Qt版本有关,之前我很长时间没遇到了

你的Demo应该要改一下才可以复现,必须要在使用FramelessMainWindow的时候,也使用一下FramelessDilog,我在关闭软件时候是会用FramelessDilog来做了个提示框。如果我没有去弹出过这个提示框,FramelessMainWindow就不会出现问题,如果弹过之后,就会出现这个问题。

我不太清楚你是怎么用的,要不你把我demo改造一下,确定能复现你那边的问题后,压缩一下贴上来

ohPigFly commented 1 year ago

1.黑边问题我要周一再验证一下,我现在没双屏幕。 2.奔溃的问题暂时没了,我会持续再关注;但是出现了这种问题,我在没有弹出过FramelessDialog的情况下,FramelessMainWindow在变化大小不会出现问题;在我弹出了FramelessDialog后,隐藏了,FramelessMainWindow在变化大小就会出现下图的问题。 image 3.在更新版本后,FramelesMainWindow启动时候会报下图这个警告,我之前自己项目遇见类似这种警告,界面就会出现奇奇怪怪的绘图问题的了,问题2的和这个会不会有关联。 image

第二个问题,我看截图是我自带的例子,意思是能用我自带的例子触发这个bug?你有修改什么地方吗,还是说用原版例子就可以? 问题3你不用担心,我内部已经处理的比较到位了,一般不会遇到绘图问题。这个警告也跟Qt版本有关,之前我很长时间没遇到了

你的Demo应该要改一下才可以复现,必须要在使用FramelessMainWindow的时候,也使用一下FramelessDilog,我在关闭软件时候是会用FramelessDilog来做了个提示框。如果我没有去弹出过这个提示框,FramelessMainWindow就不会出现问题,如果弹过之后,就会出现这个问题。

我不太清楚你是怎么用的,要不你把我demo改造一下,确定能复现你那边的问题后,压缩一下贴上来

不好意思,这段时间忙别的项目去,今天对比,终于知道是怎么才能复现了,好奇怪的,这复现手法。如下图, 1.在mainwindow的closeEvent里面去开启窗口。 2.把弹出的窗口关闭。 3.你会发现顶栏拖动已经失效了,但是显示是正常的,系统按键还正常。 4.点击最大化按键,就会出现这个问题。 image image

ohPigFly commented 1 year ago

如下图,当Dialog从屏幕1拉到屏幕2,ok按键就会点击不了。 image 如下图,使用Demo-dialog,则需要在屏幕1时候,点击more,让展开到最大。 image 如下图,当展开到最大,拖动到屏幕2,就会出现折叠了,底部的Search selection就那个部分就不能点击了。 image 如下图,虽然点击more,可以刷新一下,正常可点击,但是底部会出现了白条,感觉是按照了屏幕1时候的大小来设置了。 image

如果dialog是没有重新变大变小,就会最底下按钮都会点击不了。我的环境是,屏幕1是1920_1080,屏幕2是2560_1080的,两个屏幕的缩放是设置一样的。

关于这次提的这个双屏问题,我这次项目遇到个类似的,也是显示内容会变更,导致显示不全,然后Qt就报下图的警告,拖动一下顶栏,虽然显示大小会变回正常,但是底部的按键区域还是有一半不能点击,只能点击上半部分有效(因为我高度的变化约是按键高度的一半)。 然后我去参考了一下QMessageBox的源码,他每次更改布局中的内容都会updateSize,主要就是对布局的内容去重新计算。然后我也仿照这样去做,然后就发现重新计算后,更重要需要调用这个layout->activate(),就可以正常了,并不警告了。不知道这个和你这个有没点类似。 image

wangwenx190 commented 1 year ago

closeEvent有些特殊,我会在里面把一些内部数据清理掉,没想到你会在里面继续使用FramelessHelper,确实需要改进。下面那个问题,应该是Qt自己没处理好,我觉得不应该什么都让FramelessHelper去做workaround

ohPigFly commented 1 year ago

1.因为一般会做个退出软件的提示框,所以就在里面使用了;closeEvent里面调用FramelessHelper,之前是没问题的,也是后续才产生这个问题。 2.我也觉得,它自己计算的布局里内容不准,非要自己再去计算才准确;而且如果已经创建出来了界面,再去变动布局里的内容,内容超出显示范围,就要自己去刷新一下布局,不然它也不会show出来的时候更新,要拖动一下才更新。

wangwenx190 commented 1 year ago

closeevent这个应该是我没处理好,我去解决

wangwenx190 commented 1 year ago

https://github.com/wangwenx190/framelesshelper/blob/main/src/core/framelessmanager.cpp#L153-L158

你看看把这一段注释掉能解决你那个closeevent的问题吗

ohPigFly commented 1 year ago

https://github.com/wangwenx190/framelesshelper/blob/main/src/core/framelessmanager.cpp#L153-L158

你看看把这一段注释掉能解决你那个closeevent的问题吗

可以

wangwenx190 commented 1 year ago

https://github.com/wangwenx190/framelesshelper/blob/main/src/core/framelessmanager.cpp#L153-L158 你看看把这一段注释掉能解决你那个closeevent的问题吗

可以

能解决你的问题?注释掉这一段之后,有遇到新的问题吗?

ohPigFly commented 1 year ago

https://github.com/wangwenx190/framelesshelper/blob/main/src/core/framelessmanager.cpp#L153-L158 你看看把这一段注释掉能解决你那个closeevent的问题吗

可以

能解决你的问题?注释掉这一段之后,有遇到新的问题吗?

可以解决,暂时没发现其他问题。

wangwenx190 commented 1 year ago

https://github.com/wangwenx190/framelesshelper/blob/main/src/core/framelessmanager.cpp#L153-L158 你看看把这一段注释掉能解决你那个closeevent的问题吗

可以

能解决你的问题?注释掉这一段之后,有遇到新的问题吗?

可以解决,暂时没发现其他问题。

closeEvent的代码提交了,请拉取最新代码

ohPigFly commented 1 year ago

SHA-1: 85a3fe1b2f718ff94f83833241c202ee9ef9908a 最新的我在自己的工程里测试了,暂时还没发现有崩溃的问题。 1.在demo里测试,两个屏幕拖动,还是会有不断缩小的问题,但是这个问题不大,一般正常时候窗体都会固定个最小尺寸。 2.下图来回拖动有1秒延迟,才恢复,请问这个优化已经提交了么?我在demo上测试还是有这个延迟在的。 image

wangwenx190 commented 1 year ago

SHA-1: 85a3fe1 最新的我在自己的工程里测试了,暂时还没发现有崩溃的问题。 1.在demo里测试,两个屏幕拖动,还是会有不断缩小的问题,但是这个问题不大,一般正常时候窗体都会固定个最小尺寸。 2.下图来回拖动有1秒延迟,才恢复,请问这个优化已经提交了么?我在demo上测试还是有这个延迟在的。 image

第一个问题是Qt的bug,但我之前也提到我已经加了workaround,不知为何你那里没起作用。我再去检查一下。

第二个问题我暂时还没处理,因为目前我加的延迟只有500毫秒,按理说不应该有明显的延迟。不清楚如果继续缩短延迟会不会影响我原本想要实现的效果。

ohPigFly commented 1 year ago

第二个问题我暂时还没处理,因为目前我加的延迟只有500毫秒,按理说不应该有明显的延迟。不清楚如果继续缩短延迟会不会影响我原本想要实现的效果。

影响效果,是会影响其他功能的效果么?如果不是,可以看改哪里是缩短那个延迟,我直接调试看一下效果如何。

wangwenx190 commented 1 year ago

第二个问题我暂时还没处理,因为目前我加的延迟只有500毫秒,按理说不应该有明显的延迟。不清楚如果继续缩短延迟会不会影响我原本想要实现的效果。

影响效果,是会影响其他功能的效果么?如果不是,可以看改哪里是缩短那个延迟,我直接调试看一下效果如何。

https://github.com/wangwenx190/framelesshelper/blob/85a3fe1b2f718ff94f83833241c202ee9ef9908a/src/widgets/framelesswidgetshelper.cpp#L74

这个是切换屏幕时强制重绘前的延迟,是防备Qt自己没去刷新,时间间隔太短了不好,可能造成死循环或者没有刷新成功。你调整数值看看,能不能更短一点

wangwenx190 commented 1 year ago

第一个问题请参考这个:

https://github.com/wangwenx190/framelesshelper/blob/85a3fe1b2f718ff94f83833241c202ee9ef9908a/src/core/framelesshelper_win.cpp#L1138

你看看你那边程序有没有进入这个分支,按理说只要进入了这个分支,窗口就不会越来越小。既然你那边能复现你的问题,麻烦你那边帮忙调试下看看

ohPigFly commented 12 months ago

kRepaintTimerInterval

不好意思,这几天电脑坏了。 我改了个300ms,可以的,没有看到那个延迟,而且窗口也不会越来越小。但是就是在第一次拖动的过去的时候,大概率不会刷新,500ms的时候也会这样子的。

wangwenx190 commented 12 months ago

kRepaintTimerInterval

不好意思,这几天电脑坏了。 我改了个300ms,可以的,没有看到那个延迟,而且窗口也不会越来越小。但是就是在第一次拖动的过去的时候,大概率不会刷新,500ms的时候也会这样子的。

我根据你的反馈改了,请测试下最新代码。第一次不刷新是我故意设置的,也一并改了,你测测看呢

ohPigFly commented 12 months ago

已经可以了,硬件环境是在两个分辨率(1920*1080)一样的屏幕去测的,暂时没发现问题。 可以告知一下大概原因么?为何更改了300ms后,窗口也不会越变越小了?

wangwenx190 commented 12 months ago

已经可以了,硬件环境是在两个分辨率(1920*1080)一样的屏幕去测的,暂时没发现问题。 可以告知一下大概原因么?为何更改了300ms后,窗口也不会越变越小了?

不清楚,我只改了延迟。难道你那边换了Qt版本?

ohPigFly commented 12 months ago

没有,还是用5.15.2。虽然重新安装过,但是我试过用500ms编译出来的,现象是一样的,用300ms就没问题了。

ohPigFly commented 12 months ago

发现了个问题了,如果是锁定了大小的窗口,拖动鼠标刚好移动到屏幕交界处,然后释放,界面停在这里,就会不断resize,这个能不能优化一下这个临界点的情况。下图红色标记处是我的屏幕1和屏幕2的交界处。 image

wangwenx190 commented 12 months ago

可能还是Qt的bug

ohPigFly commented 11 months ago

如果确定是Qt的bug,那我先暂时关闭了问题?