現時点では私自身も同様のことをしようとしています。私が取ったアプローチは、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の要素にフォーカスしていないマウスクリックなどの問題があります。
ウィジェットが画面上のどこにも表示されていない場合、キーボードと特にマウス操作はどのように機能すると思われますか? –
サービスの目的は、ウィジェットの表示をリモートアプリケーションに提供することです。したがって、画像、マウス、およびキーボードは、ネットワーク経由でリダイレクトされます。注:私はこの非常に特殊なケースのためにRDPのような既存のリモートディスプレイプロトコルの代替案を検討しています。 – math