C++ 为什么使用QQuickWindow::grabWindow()会导致窗口变成图像?
我有一个QQuickWidget,想用QQuickWindow::grabWindow()抓取一个屏幕截图。但是,当我这样做时,QQuickWindow会变成一个图像,并且没有响应 以下是最小可复制代码: 该错误在发布模式下的Qt5.13到Qt5.15.1中是可复制的(出于某些原因,Qt在调试中抛出断言) //TestWidget.proC++ 为什么使用QQuickWindow::grabWindow()会导致窗口变成图像?,c++,qt,qml,qquickwidget,C++,Qt,Qml,Qquickwidget,我有一个QQuickWidget,想用QQuickWindow::grabWindow()抓取一个屏幕截图。但是,当我这样做时,QQuickWindow会变成一个图像,并且没有响应 以下是最小可复制代码: 该错误在发布模式下的Qt5.13到Qt5.15.1中是可复制的(出于某些原因,Qt在调试中抛出断言) //TestWidget.pro QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets quickwidg
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets quickwidgets
CONFIG += c++11
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp \
mainwindow.cpp
HEADERS += \
mainwindow.h \
windowgrabber.h
FORMS += \
mainwindow.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
DISTFILES += \
Main.qml
RESOURCES += \
qml.qrc
//main.cpp
#include <QApplication>
#include <QQuickWidget>
#include <QQmlContext>
#include "windowgrabber.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QQuickWidget *quickWidget = new QQuickWidget;
quickWidget->rootContext()->setContextProperty("windowGrabber", new WindowGrabber(quickWidget));
quickWidget->setSource(QUrl("qrc:/Main.qml"));
quickWidget->show();
return a.exec();
}
//窗口抓取器
#ifndef WINDOWGRABBER_H
#define WINDOWGRABBER_H
#include <QObject>
#include <QQuickItem>
#include <QQuickWindow>
class WindowGrabber : public QObject
{
Q_OBJECT
public:
WindowGrabber(QObject *parent = nullptr) : QObject(parent) {}
Q_INVOKABLE static void grabWindow(QQuickItem *item) {
item->window()->grabWindow();
}
};
#endif // WINDOWGRABBER_H
\ifndef WINDOWGRABBER\u H
#定义WINDOWGRABBER_H
#包括
#包括
#包括
类WindowGrabber:公共QObject
{
Q_对象
公众:
WindowGrabber(QObject*parent=nullptr):QObject(parent){}
Q_可调用静态窗口(QQuickItem*item){
项目->窗口()->抓取窗口();
}
};
#endif//WINDOWGRABBER\u H
代码创建一个QQuickWidget,其源代码设置为Main.qml。我想在点击qml内的按钮时截图。但是单击按钮后,quickwidget中的QQuickWindow将变成一个图像,按钮也将变成一个图像。我已经用QWidget::createWindowContainer进行了测试,它可以工作,但最好的解决方案是使用QQuickWidget。有人知道为什么会发生这种情况吗?QQuickWidget使用不可见的QQuickWindow渲染项目,并且该渲染会在QWidget中再次渲染,因此在尝试保存图像时会产生干扰,导致延迟,正如我在中指出的那样 一种可能的解决方案是直接从QQuickWidget获取:
\ifndef WINDOWGRABBER\u H
#定义WINDOWGRABBER_H
#包括
#包括
类WindowGrabber:公共QObject
{
Q_对象
公众:
WindowGrabber(QQuickWidget*小部件):m_小部件(小部件){}
Q_可调用的void grabWindow(){
if(m_小部件){
QPixmap img=m_widget->grab();
qDebug()setContextProperty(“windowGrabber”、&grabber);
setSource(QUrl(“qrc:/main.qml”);
show();
返回a.exec();
}
我的同事写了原来的帖子,但被删除了。他让我代表他重写了这个问题。我希望措辞现在能让问题更清楚。很抱歉confusion@eyllanesc他没有删除这个问题,但社区删除了它,因为它是不可复制的,所以我重写了这个问题,因为我们找不到修复的方法它。@eyllanesc是的,他的帖子被社区删除了。上面写着“这篇帖子是隐藏的。它昨天被社区自动删除了。”@eyllanesc@eyllanesc Thx获取信息。我仍在学习操作系统社区,因此我的帖子可能看起来不完美。但我们正在尝试找到替代解决方案,只希望有人能在这个问题上留下一些信息。
#ifndef WINDOWGRABBER_H
#define WINDOWGRABBER_H
#include <QObject>
#include <QQuickItem>
#include <QQuickWindow>
class WindowGrabber : public QObject
{
Q_OBJECT
public:
WindowGrabber(QObject *parent = nullptr) : QObject(parent) {}
Q_INVOKABLE static void grabWindow(QQuickItem *item) {
item->window()->grabWindow();
}
};
#endif // WINDOWGRABBER_H
Button {
id: button
text: "grab window"
onClicked: windowGrabber.grabWindow()
}