[英]Qt event when anything changed on the window/screen + Screenshot
我正在考虑扩展QT4应用程序以及一些调试可能性,以便更轻松地分析客户问题。 应用程序已经具有“调试”模式,当启用此模式时,会生成大量日志条目,这很难读取。 我想要实现的是在GUI上更改某些内容时截取应用程序的屏幕截图。 我知道它可能需要很多图片,但通常调试模式很长时间都没有启用。 问题是我找不到这样的事件/信号。 所以我有两个问题:
提前致谢!
我会使用事件过滤器和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.