从全屏Qt快速应用程序中截取屏幕截图

时间:2014-01-23 12:10:53

标签: qt screenshot qml qtquick2

这是我原来的问题:
我只想拍一张全屏QtQuick 2应用程序的截图(使用Print键)。但我得到的只是黑色或有时是白色的截图。当应用程序未以全屏启动时,它可以正常工作。


我以为我在这里发布了一个非常好的解决方案, 即使它没有解决使用外部工具拍摄屏幕截图的原始问题。

从接受回答的建议开始,我做了以下事情:

首先,我向我的QML主类(在main.qml中)添加了一个信号

signal takeScreenShot()

按下某个按钮即可发出此信号。 然后我编写了一个C ++ / QT类来自动处理这个信号:

class QMLSupplement : public QObject
{
    Q_OBJECT
    public:
        QQuickView* view;

    public:
        QMLSupplement(QObject* parent = 0);

    public slots:
        void takeScreenShot();
};

使用QQuickView的引用来截取屏幕截图。

void QMLSupplement::takeScreenShot()
{
    QString file;
    file = QDateTime::currentDateTime().toString("yyyy-MM-dd_hhmmss");
    file += ".png";

    qDebug() << "taking screenshot, saving here:" << file;

    view->grabWindow().save(file);
}

最后我连接了main.cpp中的信号和插槽:

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQuickView view;
    view.setSource(QUrl::fromLocalFile("./qml/main.qml"));
    view.setResizeMode(QQuickView::SizeRootObjectToView);

    QObject* rootObject = (QObject*) view.rootObject();

    QMLSupplement supplement;
    supplement.view = &view;
    QObject::connect(rootObject, SIGNAL(takeScreenShot()),
                     &supplement, SLOT(takeScreenShot()));

    view.show();
//  view.showFullScreen();

    return app.exec();
}

1 个答案:

答案 0 :(得分:3)

这是您正在运行的平台的限制。如果您关心这项工作,您需要自己实现该功能。 Qt为您提供足够的内容以获取Qt Quick 2窗口的内容并将其作为图像发布到剪贴板。

在您的打印键处理程序中,如果您检测到窗口是全屏的,则需要将QQuickWindow实例传递给辅助函数:

void grabAndCopy(QQuickWindow * window) {
  QApplication::clipboard()->setImage(window->grabWindow());
}

...
if (window->windowState() == Qt::WindowFullScreen) grabAndCopy(window);