遵循 QT6 弃用信息后如何将 QScreen* 转换为 QWidget*

问题描述 投票:0回答:1

我正在将 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) 

我不完全确定我哪里出错了......

c++ qt4 qt6
1个回答
0
投票

原始代码有点可疑。看起来它试图将 QDesktopWidget 设置为父级,但 QDesktopWidget 并不是真正的小部件,它的继承破坏了 LSP。最初,在 Qt3 及更早版本中,它的真正目的是成为一个控制系统桌面的小部件,允许在其上绘画,但即使如此,它也只能在 X11 中工作,而且甚至不稳定。这就是为什么他们用 QScreen 替换它:它执行屏幕几何形状和数字的所有工作,但不会假装是可绘制的小部件。

所以你最好用一些真正的小部件替换

QApplication::desktop()->screen()
,如果你在另一个小部件中构建一个小部件,最好是
this
,或者如果你在
main
中构建一个小部件,或者你的主窗口。在其他地方,您有
QApplication::activeWindow
和其他 activeSomething 函数,
allWidgets
topLevelWidgets
等。或者,当然,您可以将parent 设置为
nullptr
并自己使用智能指针、聚合或自动对象处理内存管理。

© www.soinside.com 2019 - 2024. All rights reserved.