繁体   English   中英

当窗口/屏幕上的任何内容发生变化时,Qt事件+屏幕截图

[英]Qt event when anything changed on the window/screen + Screenshot

我正在考虑扩展QT4应用程序以及一些调试可能性,以便更轻松地分析客户问题。 应用程序已经具有“调试”模式,当启用此模式时,会生成大量日志条目,这很难读取。 我想要实现的是在GUI上更改某些内容时截取应用程序的屏幕截图。 我知道它可能需要很多图片,但通常调试模式很长时间都没有启用。 问题是我找不到这样的事件/信号。 所以我有两个问题:

  1. 我可以订阅这样的活动吗? 我的意思是,只要屏幕上发生任何变化,就会触发一个事件。
  2. 我可以使用Qt截取应用程序的屏幕截图吗?

提前致谢!

我会使用事件过滤器和QTimer来做,如下所示:

class MyEventFilter : public QObject
{
public:
   MyEventFilter() : _screenshotPending(false) {/* empty */}

   virtual bool eventFilter(QObject * o, QEvent * e)
   {
      if (e->type() == QEvent::Paint)
      {
         if (_screenshotPending == false)
         {
            // we'll wait 500mS before taking the screenshot
            // that way we aren't trying to take 1000 screenshots per second :)
            _screenshotPending = true;
            QTimer::singleShot(500, this, SLOT(TakeAScreenshot()));
         }
      }
      return QObject::eventFilter(o, e);
   }

public slots:
   void TakeAScreenshot()
   {
      _screenshotPending = false;

      // add the standard Qt code for taking a screenshot here
      // see $QTDIR/examples/widgets/desktop/screenshot for that
   }

private:
   bool _screenshotPending;  // true iff we've called QTimer::singleShot() recently
};

int main(int argc, char ** argv)
{
   MyEventFilter filter;

   QApplication app(argc, argv);
   app.installEventFilter(&filter);
   [...]

   return app.exec();
}

通常,当某些窗口小部件更改时,Qt需要重新绘制它,因此您感兴趣的事件是QEvent::Paint 这里的问题是,对于彼此重叠的小部件,将有大量这些事件。 您可以覆盖QApplication::notify()以在将所有绘制事件传递给接收者之前捕获它们。

至于制作Qt应用程序的截图 - 这里有几个类似的问题,例如来自应用程序内部的qt应用程序的 截图截取特定窗口的截图 - C ++ / Qt

这里还讨论了在paintEvent()中将小部件转储到图像的线程。

关于你的第二个问题, 这里有一些旧代码可以截取窗口的截图。 您可以像这样使用此代码:

HDC WinDC = GetDC(HWND_OF_YOUR_WINDOW);
HBITMAP image = ScreenshotUtility::fromHDC(WinDC);

然后你可以将HBITMAP转换为Qt Pixmap对象并按照你喜欢的方式使用它: QPixmap pixmap = QPixmap::fromWinHBITMAP(image);

编辑:这是特定于Windows的代码,不确定其他系统上的等效代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM