从全屏 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:无法从全屏切换到嵌入式