我正在将 QT4 项目转换为 QT6 并遇到以下问题,原始代码使用 Desktop 等,这在 QT6 中已弃用,我一直在尝试遵循建议的替换。
其中一些是“简单”的替换,例如 setMargin 已变为带有 4 个参数而不是 1 个参数的 setContentsMargins,但桌面版的参数让我难住了。
QT4原代码如下:
if (QApplication::desktop()->isVirtualDesktop())
scr = QApplication::desktop()->screenNumber(pos);
else
scr = QApplication::desktop()->screenNumber(this);
setParent(QApplication::desktop()->screen(scr));
desktop 建议的替代方案是使用“PrimaryScreen”,并且 isVirtual 完全消失。我不确定是否需要虚拟检查?
我尝试将上面的内容替换为:
setParent(QGuiApplication::screenAt(pos));
这给了我以下错误:
No known conversion from QScreen* to QWidget*
我尝试了对 QWidget 的静态转换,但没有成功,而且我似乎完全无法复制 Desktop() 使用背后的原始意图。
项目中的其他地方;我的原始代码也有类似的问题:
QWidget(qApp->desktop, FLAGS)
替换代码给出相同的转换错误
QWidget(qApp->primaryScreen(), FLAGS)
我不完全确定我哪里出错了......
原始代码有点可疑。看起来它试图将 QDesktopWidget 设置为父级,但 QDesktopWidget 并不是真正的小部件,它的继承破坏了 LSP。最初,在 Qt3 及更早版本中,它的真正目的是成为一个控制系统桌面的小部件,允许在其上绘画,但即使如此,它也只能在 X11 中工作,而且甚至不稳定。这就是为什么他们用 QScreen 替换它:它执行屏幕几何形状和数字的所有工作,但不会假装是可绘制的小部件。
所以你最好用一些真正的小部件替换
QApplication::desktop()->screen()
,如果你在另一个小部件中构建一个小部件,最好是 this
,或者如果你在 main
中构建一个小部件,或者你的主窗口。在其他地方,您有 QApplication::activeWindow
和其他 activeSomething 函数,allWidgets
和 topLevelWidgets
等。或者,当然,您可以将parent 设置为 nullptr
并自己使用智能指针、聚合或自动对象处理内存管理。