В данный момент я сам пытаюсь сделать что-то подобное. Подход, который я выбрал, - это создание подкласса QGraphicsScene и переопределение события QGraphicsScene :: sceneChanged. Тогда это выглядит следующим образом (псевдокод):
QApplication app;
MyGraphicsScene* mgs = new MyGraphicsScene();
MyWidget* mw = new MyWidget();
mgs->addWidget(mw);
Теперь каждый раз, когда происходит изменение, будет вызываться ваша sceneChanged. Там вы можете получить снимок сцены в виде QImage. В моем случае я перемещаю данные пикселей в текстуру и отображаю их как наложение моей игры:
void QEOverlay::sceneChanged(QList<QRectF> list)
{
//loop through all screen areas that changed
foreach(QRectF rect, list)
{
//generate a rectangle that is a while number, and fits withing the screen
if(rect.x() < 0) rect.setX(0);
if(rect.y() < 0) rect.setY(0);
if(rect.right() > _width) rect.setRight(_width);
if(rect.bottom() > _height) rect.setRight(_height);
rect = QRectF(Round(rect.x()),Round(rect.y()),Round(rect.width()),Round(rect.height()));
//Create an image, create a qpainter, fill the image with transparent color, and then render a part of the scene to it
QImage image(rect.width(),rect.height(),QImage::Format_ARGB32);
QPainter p(&image);
image.fill(0);
render(&p,image.rect(),rect);
if(tex.lock())
{
for (u32 y = 0; y < image.height(); y++)
{
for (u32 x = 0; x < image.width(); x++)
{
QRgb pix = image.pixel(x, y);
tex.color(x + rect.left(), y + rect.top(), Color(qRed(pix), qGreen(pix), qBlue(pix), qAlpha(pix)));
}
}
tex.unlock();
}
}
}
Существует проблема с этим подходом. Вам все еще нужно перенаправить события ввода с клавиатуры и мыши на ваш подкласс. Это не очень хорошо для меня работает, есть определенные проблемы, такие как щелчок мышью, не фокусирующий QLineEdit, или элементы в QWebView.