qt - 从全屏 Qt Quick 应用程序内部截取屏幕截图

标签 qt screenshot qml qtquick2

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

<小时/>

解决方案

我想我在这里发布了一个非常好的解决方案, 尽管它并没有解决原来使用外部工具截图的问题。

从已接受答案的建议开始,我执行了以下操作:

首先,我向 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();
}

最佳答案

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

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

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

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

关于qt - 从全屏 Qt Quick 应用程序内部截取屏幕截图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21307773/

相关文章:

qt - 如何从键盘为 QTableWidget 创建信号?

python - 信号问题 - 插槽,aboutToQuit()

java - 希望我的屏幕截图显示在 JFrame 中

java - 更快的屏幕捕获方式(java)

qt - DropArea 不通知有关 onEntered、onExited、onDropped 的操作

c++ - QAbstractItemModel for QMetaObject,必须自己写吗?

c++ - 嵌套 vector 的Qt自定义树模型

C#事件窗口的屏幕截图但不捕获窗口

qt - 如何在单独的文件中定义 js 函数并将其附加到 QML 元素

qt - QML 适合所有分辨率的屏幕