2016-07-01 35 views
-1

QTでペイントイベント(WM_Paint)イベントでスクリーンショットを撮ろうとしていますが、どうすればいいですか? このコードを使ってスクリーンショットを撮りましたが、良い、それはデスクトップでいくつかの変更は、その後、あなたが興味を持っているウィジェットのタイマーQTでペイントイベント(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のコントロールからgnalを削除してください。同様に、テキストボックス内のテキストが変化したり、イメージコントロール内のイメージが変更されたときにスクリーンショットを撮りたい場合は、カスタムコントロールを作成し、コントロールの内容が変更されたときにシグナルを出してください。スロットから、スクリーンショットをキャプチャしますか?ペイントでそれをやっていると、あまりにも多くのシナリオがペイントを起こすので、不必要にスクリーンショットが取られます。 – 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

**注意** - 'return false'を' return BaseClass :: eventFilter(obj、event) 'に変更するか、継承しているクラスを壊す可能性があります。 – peppe

0

タンクあなたジョン・ハーパー、あなたのコードが有用であったが、時にいくつかの重要な私はあなたのコードがうまく動作 そこ代を変更しました私のプロジェクトフォームでイベントを押すが、私はあなたのifにペイントメソッドを追加しましたが、今度はWindowsイベントでも機能します

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

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

    return false; 
} 
+1

*自分の*にイベントフィルタをインストールするのはちょっとだけですが、そのために 'event'をオーバーライドするだけです。 – peppe

関連する問題