C++ 如何在QT中使用绘画事件(WM_Paint)截图

C++ 如何在QT中使用绘画事件(WM_Paint)截图,c++,qt,C++,Qt,我正在尝试在QT中拍摄绘画事件(WM_Paint)的截图,但我不知道如何拍摄, 我用这段代码截图,但它不是真正的好做这件事 它必须做屏幕截图时,在桌面上的一些变化不采取截图每1000毫秒与定时器 void MainWindow::shootScreen() { originalPixmap = QPixmap(); // clear image for low memory situations // on embedded

我正在尝试在QT中拍摄绘画事件(WM_Paint)的截图,但我不知道如何拍摄, 我用这段代码截图,但它不是真正的好做这件事 它必须做屏幕截图时,在桌面上的一些变化不采取截图每1000毫秒与定时器

     void MainWindow::shootScreen()
 {
 originalPixmap = QPixmap(); // clear image for low memory situations
                             // on embedded devices.

 originalPixmap = QPixmap::grabWindow(QApplication::desktop()->winId());

 //emit getScreen(originalPixmap);

 updateScreenshotLabel();

 }

 void MainWindow::updateScreenshotLabel()
 {
     this->ui->label_2->setPixmap(originalPixmap.scaled(this->ui->label_2-    >size(),
                                                  Qt::KeepAspectRatio,
                                                  Qt::SmoothTransformation));
 }
在您感兴趣的小部件上使用,然后检查适当的事件。例如,在
main窗口中
ui初始化:

void MainWindow::yourUiInitFunc()
{
    exampleWidget = new QWidget;
    ...
    exampleWidget->installEventFilter(this);
    ...
}
然后重新实现
eventFilter

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    if (obj == exampleWidget && event->type() == QEvent::KeyPress)
        shootScreen();
    return QMainWindow::eventFilter(obj, event);
}

坦克你Jon Harper你的密码很有用但我在那里做了些改变 当我的项目窗体上出现某个按键事件时,您的代码才起作用,但我在if中添加了paint方法,现在它也在windows事件上起作用

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{

    if (obj == this && QEvent::Paint == event->type()) {
        shootScreen();
    }

    return false;
}

您不能从UI上的控件发出您感兴趣的信号。例如,如果要在文本框中的文本更改时拍摄屏幕截图,或者图像控件中的图像更改时拍摄屏幕截图,只需创建一个自定义控件,并在控件内容更改时发出信号。然后从插槽中,捕获屏幕截图?如果你在画图中这样做,太多的场景会引发画图,因此不必要地截图。最简单的解决方案是在感兴趣的对象上安装事件过滤器。你截图的对象是什么?如果它是整个桌面,那么Qt中就没有跨平台的方式来监控它的更新;你必须仔细阅读在每个平台上是如何完成的。无论如何,无论Windows上屏幕的本机表示形式是什么,显然都不会得到绘制事件。请注意--将
return false
更改为
return BaseClass::eventFilter(obj,event)
,否则您可能会破坏所属的任何类!在自己身上安装事件过滤器没有什么意义,只需覆盖
event