Qt截屏及扩展

来源:互联网 发布:知乎 偶遇 编辑:程序博客网 时间:2024/05/13 19:26

QScreen *p_screen = QGuiApplication::primaryScreen();
pix = p_screen->grabWindow(this->winId(), 0, 0, 1024, 768);
imagename = QDateTime::currentDateTime().toString("MM_dd_hh_mm_ss")+ ".jpg";
if(pix.save(imagename,"jpg", -1)) {
    qDebug() << "PrintScreenSuccessfully!";
}else {
    qDebug() << "PrintScreenFailed!";
}

    这样其实简单截屏就已经有了,但是当我们需要在图片保存的时候,往往需要一个更人性化的提示,即显示一个“正在保存”,保存完图片之后,如果保存完成,则需要显示"图片保存完成",如若保存失败,那么需要显示“图片保存失败”这种需求的时候,我们是不是直接写两个Label在save一前一后的show出来呢。

    答案是否定的,因为了解ui底层实现方式的人都知道,ui底层实现是单线程的,那么在这种有save来堵塞的情况下,我们看到的现象只会是“正在保存”没有出现或者一闪而逝,最终只会看见保存完成或者保存失败,那么怎么解决呢。

    其实每个ui底层都会有一个eventLoop(),即在执行exec()的之后会陷入一个死循环,直到跳出这个死循环。ui的实现都在这个eventloop中实现的。所以直接调用show()是不会刷新出来的,也就是界面无法处理刷新事件。那我们从这边入手,如何使save在这个死循环中去实现,而不是在上层代码中实现呢?

    QTimer::singleShot(1, this, SLOT(save()));

这个静态函数接口会往eventloop放一个钩子,到了执行完“正在保存”的时候,eventLoop会通过这个钩子(即singleShot())去调用save()这个函数,这样显示item的操作才会完成。 

0 0