2016-07-01 52 views
-1

我試圖用QT中的Paint事件(WM_Paint)事件截圖,但我不知道如何, 我用這段代碼截圖,但它不是真的適合做這個 它必須做截圖時桌面的一些變化不會採取截圖每1000毫秒就你感興趣的小部件定時器如何截圖與QT的Paint事件(WM_Paint)

 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)); 
} 
+0

你不能發射si來自你熱衷的UI控件。就像,如果您想在文本框中的文本更改或圖像控件中的圖像發生更改時進行截圖,只需創建一個自定義控件並在控件內容發生更改時發出信號。從插槽中抓取屏幕截圖?如果你在繪畫中這樣做,太多的場景會激發繪畫,所以截圖會被不必要地採用。 – Suneesh

+0

最簡單的解決方案是在感興趣的對象上安裝事件過濾器。 –

+0

你在截取哪些東西?如果它是整個桌面,那麼在Qt中沒有跨平臺的方式來監視它的更新;你必須閱讀它是如何在每個平臺上完成的。無論如何,無論是在Windows上的屏幕本機表示顯然不會得到繪畫事件。 –

回答

0

使用QObject::installEventFilter,然後檢查適當的事件。例如,在你的MainWindow 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); 
} 
+2

**小心** - 更改,'返回FALSE'爲'返回的BaseClass :: eventFilter(OBJ,事件)'或者你可能會打破你從inhering任何類! – peppe

0

罐您喬恩·哈珀你的代碼是有用的,但我改變出頭有 你的代碼只是工作時的一些關鍵新聞活動在我的項目表單上,但我添加了塗料方法,如果你現在在windows事件上也可以使用

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

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

    return false; 
} 
+1

在*自己*上安裝一個事件過濾器沒什麼意義,只是爲了覆蓋'event'。 – peppe