2011-01-18 10 views
1

QWidgetオブジェクトを作成し、それらとやりとりするための、コンソール専用のwin32アプリケーション(Windowsサービスとして起動可能)があります。ディスプレイなしでQWidgetを使用することは可能ですか?

これらのQWidgetはローカルに表示されません(表示がないため)が、ペイント操作にアクセスする必要があります(たとえば、それらのスクリーンショットを作成する必要があります)。マウスとキーボード操作を傍受する必要があります。

サービスの目的は、ウィジェットの表示をリモートアプリケーションに提供することです。したがって、画像、マウス、およびキーボードは、ネットワーク経由でリダイレクトされます。

QWidgetオブジェクトをコンソールアプリケーションに含めることはできますか?その場合、ペイント、マウス、およびキーボード操作をインターセプトするのに好ましい方法は何ですか?

これが可能であれば、QAxWidgetオブジェクトでも可能ですか?

+1

ウィジェットが画面上のどこにも表示されていない場合、キーボードと特にマウス操作はどのように機能すると思われますか? –

+0

サービスの目的は、ウィジェットの表示をリモートアプリケーションに提供することです。したがって、画像、マウス、およびキーボードは、ネットワーク経由でリダイレクトされます。注:私はこの非常に特殊なケースのためにRDPのような既存のリモートディスプレイプロトコルの代替案を検討しています。 – math

答えて

1

Qt for embedded Linux.で確認してください。 Qtはこれを行うことができるように設計されていますが、それは自明ではありません。

キーボード、マウス、グラフィカルなUIが必要なコンソールモードのサービスをお持ちの場合は、適切な状況にないと思われます。ユーザーと対話する必要があるため、サービスではないはずです。マウスの必要性は、コンソールアプリケーションであってはならないことを示唆しています。

1

あなたはGUIがprovided constructorsのいずれかを使用せずにQApplicationを作成することができます。GUIの操作を行うために

QApplication::QApplication(int&, char**, bool GuiEnabled) 

は、あなたがまだ使用可能GUIが必要になります。たとえば、Linuxでは、Xが実行され、使用可能である必要があります。私は何が起こることができるかできないのかについて一定の制限があると信じていますが、詳細を提供するブログ投稿http://labs.qt.nokia.comを見つけることができません。

+1

リンクから: "WindowsとMac OSでは、現在、ウィンドウシステムはGUIenabledの値にかかわらず常に初期化されます。これはQtの将来のバージョンで変更される可能性があります。 – ChrisV

0

現時点では私自身も同様のことをしようとしています。私が取ったアプローチは、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の要素にフォーカスしていないマウスクリックなどの問題があります。

+0

これは興味深い解決策ですが、ドキュメントによると、QAxWidgetオブジェクトでは機能しません... – math

関連する問題