Событие Qt, когда что-либо изменилось в окне / экране + Скриншот

Я думаю о расширении приложения QT4 с некоторыми возможностями отладки, чтобы упростить анализ проблем клиентов. Приложение уже имеет режим «Отладка», когда он включен, генерируется много записей журнала, которые трудно читать.
Я хотел бы сделать снимок экрана приложения, когда что-то меняется в графическом интерфейсе. Я знаю, что это может сделать много снимков, но обычно режим отладки не включен в течение длительного времени. Проблема в том, что я не могу найти такое событие / сигнал. Итак, у меня два вопроса:

  1. Есть ли такое событие, на которое я мог бы подписаться? Я имею в виду, событие, которое
    срабатывает всякий раз, когда что-то меняется на экране.
  2. Могу ли я сделать скриншот приложения, используя Qt?

Заранее спасибо!

1

Решение

Я бы сделал это, используя фильтр событий и 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();
}
2

Другие решения

Как правило, когда некоторые виджеты изменяются, Qt необходимо перерисовать их, поэтому интересующее вас событие QEvent::Paint, Проблема здесь в том, что будет множество этих событий для виджетов, которые перекрывают друг друга. Вы можете переопределить QApplication::notify() поймать все события рисования, прежде чем они даже доставлены получателям.

Что касается создания скриншотов приложения Qt — здесь, на SO, есть несколько похожих вопросов, например снимок экрана приложения qt из приложения или же Снимок экрана конкретного окна — C ++ / Qt

Вот также поток, обсуждающий сброс виджетов к изображениям в paintEvent(),

1

Что касается вашего второго вопроса, Вот это мой старый код, который может сделать скриншот окна. Вы можете использовать этот код так:

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

Затем вы можете преобразовать HBITMAP в объект Qt Pixmap и работать с ним так, как вам нравится: QPixmap pixmap = QPixmap::fromWinHBITMAP(image);,

РЕДАКТИРОВАТЬ: это специфичный для Windows код, не уверен, какой может быть эквивалент в других системах.

0
По вопросам рекламы [email protected]