Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么使用QQuickWindow::grabWindow()会导致窗口变成图像?_C++_Qt_Qml_Qquickwidget - Fatal编程技术网

C++ 为什么使用QQuickWindow::grabWindow()会导致窗口变成图像?

C++ 为什么使用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

我有一个QQuickWidget,想用QQuickWindow::grabWindow()抓取一个屏幕截图。但是,当我这样做时,QQuickWindow会变成一个图像,并且没有响应

以下是最小可复制代码: 该错误在发布模式下的Qt5.13到Qt5.15.1中是可复制的(出于某些原因,Qt在调试中抛出断言)

//TestWidget.pro

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()
}