从全屏 Qt Quick Application 内部截取屏幕截图

Posted

技术标签:

【中文标题】从全屏 Qt Quick Application 内部截取屏幕截图【英文标题】:Taking screenshot from inside fullscreen Qt Quick Application 【发布时间】:2014-01-23 12:10:53 【问题描述】:

这是我最初的问题: 我只想截取我的全屏 QtQuick 2 应用程序的屏幕截图(使用 Print 键)。但我得到的只是黑色或有时是白色的屏幕截图。当应用程序未以全屏模式启动时,它可以工作。


解决方案

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

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

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

signal takeScreenShot()

这个信号是通过按下某个按钮发出的。 然后我在 QML 代码之外写了一个 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】:

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

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

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


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

【讨论】:

以上是关于从全屏 Qt Quick Application 内部截取屏幕截图的主要内容,如果未能解决你的问题,请参考以下文章

windows用windeployqt发布qt quick application程序

QT Quick Application Window 嵌入 C++ 对象

3 秒后所有 QT Quick Application 崩溃

MPMoviePlayerController:无法从全屏切换到嵌入式

无法运行默认的 Qt Quick Application StackView 模板:“下级停止,因为它触发了异常”

如何检测 UITableView 上的“快速触摸”以切换到/从全屏?