Giter Site home page Giter Site logo

Comments (76)

wangwenx190 avatar wangwenx190 commented on June 13, 2024

看了你的GIF动画,都是中文,你应该是国人吧?是国人的话就不要用英文交流了,我的英语也很是蹩脚。

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

你说的那两个问题,第一个我大概知道问题在哪,这两天我试着解决下,第二个暂时还不清楚,我用win7实机测试时没发现,可能是后来改坏了。

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

Win7物理机默认composition应该是打开的吧,virtualbox虚拟机的win7里是关的。
不一样的测试用例。

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

代码更新了,你测下最新的代码,看看第一个问题解决了没有。

Win7物理机默认composition应该是打开的吧,virtualbox虚拟机的win7里是关的。
不一样的测试用例。

关闭时的情况我也测过,真机上测的,不过当时还是这个项目比较早期的时候,那时还没什么问题,现在代码已经变了很多了,估计是后来哪里改坏了。

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

测了,第一个问题还是没解决。
第二个不是关闭,是最小化,然后恢复。

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

测了,第一个问题还是没解决。

这就奇怪了。我再思考思考。

第二个不是关闭,是最小化,然后恢复。

嗯,这个能从gif里看出来。不过暂时不知道原因,你把899行和903行那两个函数注释掉试试。

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

补充一个问题:拉动左边框和上边框,右边框和下边框会闪烁。

在虚拟机这种场景下如果之前没测过,可能还有其他问题。
很矛盾,目前云这么流行,虚拟机这种场景还不能不支持。
我自己的测试目前也基本都是靠虚拟机,只有少数环境采用真机测试。

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

特意把rossy的代码跑起来测了下。
前两个问题,rossy的代码没有,第三个问题rossy的代码也有。

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

我主要就是在虚拟机中测的,毕竟我自己的电脑用的是win10,我也不想因为这个再专门装个win7。

composition关闭的情况,我测试的比较少,毕竟这种情况也不常见;composition启用的场景下,大概是没什么问题的。

不是不支持虚拟机,而是Win7+composition关闭的这种情况比较少见,所以可能有问题没能发现。而且云不云跟虚拟机也没啥关系。

这个项目最初的时候,基本就是纯移植的rossy的代码,效果还行,但在win7上有bug,所以后来改来改去,已经变得和rossy的代码很不一样了。具体是哪里产生了前两个问题,现在也很难说。

关于第二个问题,你试试把我说的那两个函数注释掉再运行,看看有没有改善。

关于你说的那个闪烁的问题,我也测过,只要用的不是系统的边框,就一定存在这个问题,你可以去试试火狐、Chrome、Word、QQ或者其他一切你能想到的自定义边框的程序,看看有没有这个问题。

我不知道你对无边框的了解有多少,如果有能力的话,你也自己调试调试,看看可能是哪里出了问题。

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

而且rossy的代码是针对纯Win32工程的,我猜你是直接编译运行的,而不是移植到Qt中再编译的吧?如果你移植过就会发现,有些东西移植到Qt中之后会变得很麻烦甚至直接无法移植,移植时必须要有所取舍,所以在Qt中很难做到与rossy完全等价的效果。

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

云和虚拟机关系挺大的。
现在很多windows跑在云上。虚拟机的显卡一般不是物理显卡,aero能不能跑起来是个问题。
至少我用最新的virtualbox跑win7 aero就驱不起来。

我直接跑的rossy原码,没有移植。我也折腾过一阵Qt无边框窗口,Qt封装的太多,会有很多莫名其妙的问题,我本身对GUI也不太熟悉,折腾不动了。

第三个问题我知道基本现有流行的无边框应用都没能解决这问题,所以我看到你这个项目在我的Win10机器上居然没有这个问题,感到很惊奇。

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

云和虚拟机关系挺大的。

好吧,我不太了解这个,可能发表了错误的言论,我道歉。

用最新的virtualbox跑win7 aero就驱不起来。

我用的是VMware Player,免费的,Aero自动开启,Win7~8.1都没问题,你可以试试。VirtualBox我也用,但和VMware相比,还是稍差点。composition关闭的情况,我再研究下,大概是WM_NCACTIVATE的处理还不完美。

Qt封装的太多,会有很多莫名其妙的问题

是的,我想说的就是这个,很多原生Win32程序支持的特性,无法在Qt中实现,就算移植过去了,也完全不起作用了,为此我还专门去咨询过Qt公司的工程师,得到的答复是,由于Qt是完全自绘的,所以尽量不要搞这种东西,很可能会把Qt自身的功能破坏掉。所以很多东西,就算你想移植到Qt中,也是有心无力。

第三个问题我知道基本现有流行的无边框应用都没能解决这问题,所以我看到你这个项目在我的Win10机器上居然没有这个问题,感到很惊奇。

是没有这个问题,但也存在别的问题,现阶段,我暂时还没找到完美的解决方案。

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

代码改了些,有空你测一下最新的代码有没有修复激活窗口时边框会闪一下的问题

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

我这边虚拟机不知怎么不能用了,所以暂时没法自己测,只能麻烦你了,不好意思了

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

没关系,我现成的环境。
怎么弹出两个窗口?

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

还是不行。切换的时候点击标题栏必现。

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

题外话,用Qt5.6.3不能编译,最低要求什么版本?

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

不对,你加了qtquick的例子,我应该测哪个?

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

怎么弹出两个窗口?

加了个Qt Quick的例子。

还是不行。切换的时候点击标题栏必现。

难受了。我再研究下。

题外话,用Qt5.6.3不能编译,最低要求什么版本?

可能用到了太新的函数。报错信息里提示什么?

不对,你加了qtquick的例子,我应该测哪个?

哪个都行,反正如果有问题的话,肯定都有问题。

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

我这边只装了VS2019,没法测Qt 5.6,我还以为兼容性没什么问题呢

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

核心代码本身对Qt版本没多大要求,只要是Qt5就行。可能是某些辅助函数的问题。

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

刚才测的还是原来的程序,没注意你的程序名都变了。
新的程序貌似没有第一个问题了。不过这样两个搞在一起测起来有点麻烦,我的测试环境只有widgets的。
还有新的代码为什么把其他平台的那个类删了?

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

我这边只能想到QOperatingSystemVersion,这个类5.9才引入,不过没关系,可以用QSysInfo代替。其他的地方暂时还不知道。

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

现在代码引入了quick,我的5.6.3不包含quick,暂时没法给你编译错误。

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

没注意你的程序名都变了。

感觉原来那个不太贴切,就随手改了。反正是示例程序,无所谓的。

我的测试环境只有widgets的。

行,那我用宏判断下,如果没有quick模块,自动跳过quick的编译。

还有新的代码为什么把其他平台的那个类删了?

我是觉得整体上就是Windows平台的解决方案,所以就把Unix平台的方案删了,如果你觉得那个也有用,我再加回来。

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

回退到加入quick之前,编译错误:
compile-error.txt

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

我还需要Mac平台,如果不跨平台,何苦和Qt较劲。

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

回退到加入quick之前,编译错误:
compile-error.txt

看了一下,最主要的错误是startSystemMovestartSystemResize找不到,这两个API是5.15才引入的,之前的版本没有,没法解决。Windows平台的方案里用不到它两个,主要是unix平台要用。

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

Qt自身的问题确实是没法解决,但mac平台也可以像Windows平台这样用原生代码解决,如果你没法升级Qt版本的话,建议看看https://github.com/Bringer-of-Light/Qt-Nice-Frameless-Window

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

代码更新了,最新的代码应该是能用5.6编译了。

如果你的qt没有装quick模块,就把pro文件里的QT += quick去掉,代码里会根据宏定义自动屏蔽quick相关的部分。

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

unix平台的那个类你之前测过吗?由于我的开发重心一直都是Windows平台,所以那个类也没怎么好好测过,不知道具体效果。

我会把它再加回来的,不过昨晚我发现那个类有些地方写得有问题,我改好再重新传上来。

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

没测过,我目前也还只在Windows,Windows功能完善了才会移到Mac。
5.6.3编译还有点问题:
compile-error.txt

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

新的程序貌似没有第一个问题了

确定吗?如果确定解决了,我就不继续研究了。

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

没测过,我目前也还只在Windows,Windows功能完善了才会移到Mac。
5.6.3编译还有点问题:
compile-error.txt

好的,是qAsConst的问题,好办。

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

代码更新了。qAsConst是5.7引入的,5.6用std::as_const代替就好了。希望这是最后一个问题。

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

这个功能是C++17引入的,希望你的编译器支持C++17。不过我看你用的是MSVC2017,大概是没问题的。

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

第一个问题解决了。
但带来几个其他新问题:

  1. Qt5.14 去掉quick,编译不通过,还依赖qml:
link /NOLOGO /DYNAMICBASE /NXCOMPAT /OPT:REF /INCREMENTAL:NO /SUBSYSTEM:WINDOWS "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" /OUT:release\framelessapplication.exe @C:\Users\ngugcx\AppData\Local\Temp\framelessapplication.exe.4368.15.jom
qmlcache_loader.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) int __cdecl QQmlPrivate::qmlregister(enum QQmlPrivate::RegistrationType,void *)" (__imp_?qmlregister@QQmlPrivate@@YAHW4RegistrationType@1@PAX@Z) referenced in function "public: __thiscall `anonymous namespace'::Registry::Registry(void)" (??0Registry@?A0xc8589f3b@@QAE@XZ)
qmlcache_loader.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) void __cdecl QQmlPrivate::qmlunregister(enum QQmlPrivate::RegistrationType,unsigned int)" (__imp_?qmlunregister@QQmlPrivate@@YAXW4RegistrationType@1@I@Z) referenced in function "void __cdecl `struct Q_QGS_unitRegistry::Registry * __cdecl Q_QGS_unitRegistry::`anonymous namespace'::Q_QGS_unitRegistry::innerFunction(void)'::`2'::`dynamic atexit destructor for 'holder''(void)" (??__Fholder@?1??innerFunction@Q_QGS_unitRegistry@?A0xc8589f3b@2@YAPAURegistry@2@XZ@YAXXZ)
release\framelessapplication.exe : fatal error LNK1120: 2 unresolved externals
  1. Qt5.6.3的例子界面有问题,右边下边多了边框:
    image
  2. 点close,程序崩溃:
    image

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

崩溃可能是double free了,是不是哪里用了栈上的Qt对象?

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

Qt5.14 去掉quick,编译不通过,还依赖qml:

不应该,我这边去掉后能编译。你清理一下,重新qmake重新编译试试。

Qt5.6.3的例子界面有问题,右边下边多了边框:
image

从这个图片看不出来边框在哪。。。

点close,程序崩溃:

这个是我的示例代码写的有问题,跟无边框大概是没关系的

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

崩溃可能是double free了,是不是哪里用了栈上的Qt对象?

main.cpp里用的都是栈上的对象,但是我没有主动释放任何对象,按理说不应该出现这种问题。这个我暂时还没头绪,你能不能帮我调试下,找找问题在哪?

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

Qt5.14 去掉quick,编译不通过,还依赖qml:

不应该,我这边去掉后能编译。你清理一下,重新qmake重新编译试试。

好了,把编译文件夹删了重来就好了。

Qt5.6.3的例子界面有问题,右边下边多了边框:
image

从这个图片看不出来边框在哪。。。

放大看下。

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

data_widget.ignoreObjects << &minimizeButton << &maximizeButton

是这里的问题吗?

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

崩溃可能是double free了,是不是哪里用了栈上的Qt对象?

main.cpp里用的都是栈上的对象,但是我没有主动释放任何对象,按理说不应该出现这种问题。这个我暂时还没头绪,你能不能帮我调试下,找找问题在哪?

5.14的也是有问题的。

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

崩溃可能是double free了,是不是哪里用了栈上的Qt对象?

main.cpp里用的都是栈上的对象,但是我没有主动释放任何对象,按理说不应该出现这种问题。这个我暂时还没头绪,你能不能帮我调试下,找找问题在哪?

5.14的也是有问题的。

你指的是崩溃这个问题?这个是代码写坏了,跟Qt版本没什么关系。我这边用的是5.15,也是崩溃。

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

放大看下。

看到了。我猜是DPI的问题。你是在win10上测的吗?把缩放改成100%试试。如果改成100%还是这样,那大概就跟DPI没什么关系了。

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

崩溃可能是double free了,是不是哪里用了栈上的Qt对象?

main.cpp里用的都是栈上的对象,但是我没有主动释放任何对象,按理说不应该出现这种问题。这个我暂时还没头绪,你能不能帮我调试下,找找问题在哪?

5.14的也是有问题的。

你指的是崩溃这个问题?这个是代码写坏了,跟Qt版本没什么关系。我这边用的是5.15,也是崩溃。

可能是因为你把栈上的Qt对象挂到Qt的父子关系链上了,自己析构了,Qt的内存管理又重新free一次。理论上除了top level的,其他都应该是堆上的。

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

崩溃可能是double free了,是不是哪里用了栈上的Qt对象?

main.cpp里用的都是栈上的对象,但是我没有主动释放任何对象,按理说不应该出现这种问题。这个我暂时还没头绪,你能不能帮我调试下,找找问题在哪?

5.14的也是有问题的。

你指的是崩溃这个问题?这个是代码写坏了,跟Qt版本没什么关系。我这边用的是5.15,也是崩溃。

可能是因为你把栈上的Qt对象挂到Qt的父子关系链上了,自己析构了,Qt的内存管理又重新free一次。理论上除了top level的,其他都应该是堆上的。

好的,我研究下。

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

放大看下。

看到了。我猜是DPI的问题。你是在win10上测的吗?把缩放改成100%试试。如果改成100%还是这样,那大概就跟DPI没什么关系了。

Win10/Win7都一样。我的系统从来没有设置过DPI,所有DPI相关配置都是默认的。

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

放大看下。

看到了。我猜是DPI的问题。你是在win10上测的吗?把缩放改成100%试试。如果改成100%还是这样,那大概就跟DPI没什么关系了。

Win10/Win7都一样。我的系统从来没有设置过DPI,所有DPI相关配置都是默认的。

但是我自己测的时候,从来没遇到过这个问题,想不明白为什么Qt换个版本就出问题。由于5.6是Qt第一次引入高DPI缩放的版本,所以我才怀疑是不是这方面有bug。

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

放大看下。

看到了。我猜是DPI的问题。你是在win10上测的吗?把缩放改成100%试试。如果改成100%还是这样,那大概就跟DPI没什么关系了。

Win10/Win7都一样。我的系统从来没有设置过DPI,所有DPI相关配置都是默认的。

但是我自己测的时候,从来没遇到过这个问题,想不明白为什么Qt换个版本就出问题。由于5.6是Qt第一次引入高DPI缩放的版本,所以我才怀疑是不是这方面有bug。

所以我才固定版本不敢动。

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

崩溃的问题解决了,都改成指针就好了。边框问题暂时还没头绪。我先去完善那个unix平台的解决方案。

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

奇怪,编译没有qtquick的版本,把pro里quick那行注释。
Qt5.14.1, Release版本还是编译不过,和之前一样的错,但Debug版本可以编译。

link /NOLOGO /DYNAMICBASE /NXCOMPAT /OPT:REF /INCREMENTAL:NO /SUBSYSTEM:WINDOWS "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" /OUT:release\framelessapplicationd.exe @C:\Users\ngugcx\AppData\Local\Temp\framelessapplicationd.exe.10260.4203.jom
qmlcache_loader.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) int __cdecl QQmlPrivate::qmlregister(enum QQmlPrivate::RegistrationType,void *)" (__imp_?qmlregister@QQmlPrivate@@YAHW4RegistrationType@1@PAX@Z) referenced in function "public: __thiscall `anonymous namespace'::Registry::Registry(void)" (??0Registry@?A0x846c0b3f@@QAE@XZ)
qmlcache_loader.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) void __cdecl QQmlPrivate::qmlunregister(enum QQmlPrivate::RegistrationType,unsigned int)" (__imp_?qmlunregister@QQmlPrivate@@YAXW4RegistrationType@1@I@Z) referenced in function "void __cdecl `struct Q_QGS_unitRegistry::Registry * __cdecl Q_QGS_unitRegistry::`anonymous namespace'::Q_QGS_unitRegistry::innerFunction(void)'::`2'::`dynamic atexit destructor for 'holder''(void)" (??__Fholder@?1??innerFunction@Q_QGS_unitRegistry@?A0x846c0b3f@2@YAPAURegistry@2@XZ@YAXXZ)
release\framelessapplicationd.exe : fatal error LNK1120: 2 unresolved externals

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

貌似Qt自己的问题:https://bugreports.qt.io/browse/QTBUG-80470
pro里加上这行就好了
CONFIG -= qtquickcompiler

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

代码更新了。主要改动是如下两点:

  1. 新代码会自动判断模块是否存在,不用再手动修改pro文件了。
  2. unix平台的解决方案添加回来了,并且做了很多改进。由于这个方案使用了5.15才引入的API,因此最低Qt版本限制为5.15。5.15引入的startSystemMovestartSystemResize是跨平台API,支持X11、Wayland和macOS(虽然也支持Windows,但效果不太好),我看过Qt添加这个功能时提交的代码,量挺大的,而且与Qt内部事件系统进行了大量交互,所以我倾向于直接使用这两个API,而不是自己去实现。所以如果你不能升级Qt版本的话,是不能用这个类的,我也不打算把Qt已经做过的事情再重复一遍。如果你只能使用老版本的Qt,但还需要macOS的解决方案,可以参考https://github.com/Bringer-of-Light/Qt-Nice-Frameless-Window

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

刚刚我自己测的时候,发现了一个奇怪的现象。有些问题只有debug版才有,release版没有。

比如debug版,窗口在最大化和还原这两个状态间切换时,会瞬间透明一下,看起来就像是闪了一下。但release版就没这个问题。

貌似Qt自己的问题:https://bugreports.qt.io/browse/QTBUG-80470
pro里加上这行就好了
CONFIG -= qtquickcompiler

这个可能是类似的现象,debug版和release版的配置不一样导致的。

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

刚刚我自己测的时候,发现了一个奇怪的现象。有些问题只有debug版才有,release版没有。

比如debug版,窗口在最大化和还原这两个状态间切换时,会瞬间透明一下,看起来就像是闪了一下。但release版就没这个问题。

貌似Qt自己的问题:https://bugreports.qt.io/browse/QTBUG-80470
pro里加上这行就好了
CONFIG -= qtquickcompiler

这个可能是类似的现象,debug版和release版的配置不一样导致的。

应该不一样,这个只是个编译问题。
是整体透明,还是一部分?

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

是整体透明,还是一部分?

整个窗口都变透明了,但很快又会恢复不透明,不仔细看还注意不到。

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

现在我被一个小问题卡住了,就是我想根据窗口句柄获取其对应的QWindow(能保证确实是QWindow的句柄),在网上搜了搜,大多是说用QWindow::fromWinId这个函数,但我用了用,发现不行,能获取一个QWindow,但不是我创建的那个。关于这个问题,你知道怎么解决吗?

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

现在我被一个小问题卡住了,就是我想根据窗口句柄获取其对应的QWindow(能保证确实是QWindow的句柄),在网上搜了搜,大多是说用QWindow::fromWinId这个函数,但我用了用,发现不行,能获取一个QWindow,但不是我创建的那个。关于这个问题,你知道怎么解决吗?

我都没用过QWindow。不太清楚你想获取的是什么,你是想用句柄作为一个索引来获取到你之前创建的QWindow对象?如果是这样,看fromWinId的说明是不行的,它是用来从一个裸句柄生成一个新的QWindow对象。如果是我想的这样,你可能需要弄个全局表,来保存句柄和对象的映射。

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

如果不是高频操作,也可以考虑用这种方式,性能会差点:

QWindow *getWindow(HWND hwnd)
{
    foreach (QWidget *w, qApp->topLevelWidgets()) {
        if (qobject_cast<QWindow*>(w)) {
            if ((HWND)(w->winId()) == hwnd)
              return qobject_cast<QWindow*>(w);
        }
    }
    return nullptr;
}

我一般用这种方式来获取顶级窗口,没试过,不知道对QWindow好不好使。

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

不行,QWindow不是widget。。。

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

不行,QWindow不是widget。。。

没事,道理都是一样的,多谢了。

我看Qt自己也是这么做的,没有什么更好的方法,也只能这样了。

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

WM_NCCALCSIZE的处理其实很简单,只要不修改lParam就能去掉边框。你这个消息的处理没什么问题。按钮跑出来的原因有很多,我这边的经验是要去看看WM_NCACTIVATEWM_NCPAINT这两个消息的处理。改成下面这样试试:

case WM_NCACTIVATE:
case WM_NCPAINT: {
    *result = 0;
    return true;
} break;

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

按钮你是怎么加的?就是往布局里放了几个QPushButton吗?没搞什么*操作?

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

没有任何操作。
就是标题栏分成左右两部分,右边这部分放了三个按钮,按钮连操作都没绑定。
我试了把按钮放到左边也一样,好像只要放了按钮就触发了什么东西。

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

那你把那两个消息的处理改成我发的那样,看看有没有改善

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

原来是WS_SYSMENU的锅,把这个从style里去掉就好了。

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

例子程序在Win7上不能锁定到任务栏。

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

例子程序在Win7上不能锁定到任务栏。

单独开个issue吧,这个issue已经讨论太多东西了。

还有,不能锁定到任务栏是什么意思?能不能详细描述下(在新issue里)

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

关于那个白边的问题,现在已经基本确定了,是Qt自身的问题,因为我用5.15编译的程序,放到一个纯净的Win7中运行,效果很正常,没有白边。刚才我在一个群里,里面有个人也反映有白边,他用的也是5.6.3。这种跟Qt版本有关的问题就很难办了,现在看来大概率是Qt处理DPI缩放的BUG。

还有,窗口会瞬间变透明的问题又不能复现了。

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

还原瞬间变透明的问题我这可以复现,
commit id: 36609f1

from framelesshelper.

ngugcx avatar ngugcx commented on June 13, 2024

最新的代码也能重现。

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

这个问题在某几个commit后无法复现,看起来就像修复了,后来又时不时的能复现,着实难办。

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

之前是通过修改DwmExtendFrameIntoClientArea修复的,估计问题还是在这,我再看看

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

刚才我又测了测(代码没动),发现这个bug比较难触发。我不停的在最大化和还原之间来回切换,是会有几次触发这个问题,但总体来说概率还是比较小,大部分情况下不会有这个问题。

from framelesshelper.

wangwenx190 avatar wangwenx190 commented on June 13, 2024

感觉应该没什么问题了,这个issue我先关了。如果还有问题,可以再重新打开。

from framelesshelper.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.