QQuickWindow::grabWindow:场景图形已经在使用
QQuickWindow::grabWindow: scene graph already in use
我尝试了这里显示的代码:如何截图Qt/QML
在执行时,我得到标题中写的错误。
My main.cpp is:
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQuickWindow>
#include <QImage>
#include <QDebug>
#include "screenshot.h"
#include <QQuickView>
#include <QQmlContext>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
const char* drigUi = "DrigUI";
qmlRegisterType <screenCapture> (drigUi, 1, 0, "ScreenShot");
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
我使用了这个capture函数:
void screenCapture::capture(QString const &path) const
{
QImage img = currentView_->grabWindow();
img.save(path);
}
并在构造函数中添加以下内容:
currentView_ = new QQuickView;
我的<<p> strong> 主要。qml : import QtQuick 2.4
import QtQuick.Window 2.2
import DrigUI 1.0
Window
{
visible: true
height: 370
width: 370
ScreenShot { id: screenShot }
Rectangle
{
id: ll
height: 30
width: 50
x: 180; y: 0; color: "red"
MouseArea
{
anchors.fill: parent
onClicked: screenShot.capture ("l.png")
}
}
}
这个错误是什么意思?解决它的方法是什么?我还能在这里提供什么信息?
我也在QtCenter.org上发布了这个问题,并从那里得到了启发。
我问你为什么要创建一个空QQuickView的屏幕截图?难道你不想截取你用QML创建的窗口的屏幕截图吗?
我意识到我没有在main.cpp
的任何地方使用QQuickView
。因此,这意味着我使用的QQuickView
是空的。
我的程序的另一部分是使用QQuickWindow
而不是QQuickView
,所以我用QQuickWindow
代替QQuickView
,如下所示:
ScreenCapture.h
#ifndef SCREENSHOT_H
#define SCREENSHOT_H
#include <QObject>
class QString;
class QQuickWindow;
class screenCapture : public QObject
{
Q_OBJECT
public:
explicit screenCapture (QQuickWindow *parent = 0);
public slots:
void capture (QString const &path) const;
private:
QQuickWindow *currentWindow;
};
#endif // SCREENSHOT_H
ScreenCapture.cpp
#include <QPixmap>
#include <QQuickView>
#include <QDebug>
#include "screenshot.h"
screenCapture::screenCapture(QQuickWindow *currentWindow) :
QObject(0), currentWindow (currentWindow)
{
}
void screenCapture::capture (QString const &path) const
{
QImage p = currentWindow->grabWindow ();
bool kk = p.save (path);
qDebug () << kk;
}
main.cpp
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
QObject *topLevel = engine.rootObjects().value(0);
QQuickWindow *window = qobject_cast<QQuickWindow *>(topLevel);
screenCapture launcher (window);
engine.rootContext()->setContextProperty("ScreenShot", &launcher);
window->show();
return app.exec();
}
现在,在QML端,我们可以直接使用
ScreenShot.capture ("/home/*****/Desktop/l.png")
我们想要的任何地方。它的工作原理。
相关文章:
- C++图形类指针混淆
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 如何在内核C++中使用1920x1080x16M图形或类似的16M颜色?(VGA)
- 这是实现图形的坏方法吗
- 打印 ONNXRUNTIME::图形没有模型
- 提升如何在图形可视化中写入边缘的权重?
- Doxygen - 如何在不生成图形的情况下生成文本调用关系结果
- C++ 中的图形菜单
- 将图形属性与 std::unique_ptr 捆绑在一起
- 从流到邻接列表的向量读取图形
- 替代在python中制作邻接列表与图形问题的字典?(如 C++ 中的 vector<vector<int&g
- 将图形表示为unordered_map<字符串、向量>时拓扑排序错误<string>
- 直接显示手动图形内存泄漏
- Directx 12 :在两个进程之间共享图形内存
- Microsoft C++ 用于图形 API 的 Rest SDK
- 如何将到达图形视图右侧(末端)的QGraphicsPixmapItem移动到左侧(开始)侧(就像在贪吃蛇游戏中发生的事情
- 图形初学者C++(跳过控制台)?
- 在 cpp 中最简单的图形实现
- 提升图形库:资源受限的最短周期
- QQuickWindow::grabWindow:场景图形已经在使用