2015-11-24 47 views
1

我正在考虑扩展QT4应用程序,使其具有一些调试功能,以便更轻松地分析客户问题。应用程序已经有一个“调试”模式,当启用时,会生成很多日志条目,这很难读取。 我想要做的是在GUI上更改某些内容时截取该应用程序的屏幕截图。我知道它可能需要很多图片,但通常调试模式很长一段时间未启用。问题是我找不到这样的事件/信号。所以我有两个问题:当窗口/屏幕上发生任何变化时发生Qt事件+屏幕截图

  1. 是否有这样一个事件,我可以订阅?我的意思是,当屏幕上发生任何更改时,会触发一个事件 。
  2. 我可以使用Qt截取应用程序的截图吗?

在此先感谢!

回答

2

我会用一个事件过滤器和一个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(); 
} 
0

至于你的第二个问题,here是我的一些旧代码,可以截取一个窗口的截图。您可以使用此代码如下所示:

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

然后您可以将HBITMAP转换为Qt的像素图的对象,你怎么样使用它:QPixmap pixmap = QPixmap::fromWinHBITMAP(image);

编辑:这是Windows特定的代码,不知道其他系统上的等效项可能是什么。

+1

注意,这个代码是针对Windows的,所以做这种方式会使得程序不可移植。 –

+0

良好的通话,我忘了提及。 –

1

一般来说,当一些小部件改变Qt需要重新绘制它时,所以您感兴趣的事件是QEvent::Paint。这里的问题是这些事件中会有大量的事件相互重叠。您可以覆盖QApplication::notify()以在所有绘画事件发送到接收者之前捕获所有绘画事件。

,作为使Qt应用程序的截图 - 有几个类似的问题在这里SO,例如screenshot of a qt application from inside the applicationTaking screenshot of a specific window - C++/Qt

Here也是一个线程在paintEvent()讨论倾销小部件图像。