2013-08-27 21 views
7

私たちのプロジェクトでは、3つの独立したアプリケーションがあり、これらの3つのアプリケーションを制御するQTコントロールアプリケーションを開発する必要があります。メインウィンドウは3つのサブウィンドウに分割され、それぞれに別の1つのアプリケーションが表示されます。
私はQX11EmbedWidgetQX11EmbedContainerウィジェットを使用すると思ったが、それには二つの問題:QTアプリケーションをQTウィジェットに埋め込む方法

  1. QX11Embed *はX11プロトコルに基づいており、私はそれは、Windows OSのような非x11のシステムではサポートされています場合は知りませんさ。
  2. QT 5以降、これらのクラスは存在しないため、QTドキュメントにはその理由が記載されていません。

私はそれを使用するかどうかわからないので、私は答えを得ることができます。
また、QT 5.1には、X11Embedの代わりになる投稿のように見えることがあるQWidget::createWindowContainer();という機能が含まれていることがわかります。誰もがもっと私をexplianしてください。私はどのようにこの機能を使用して、その内部に別のアプリケーション(例えばCalculator)を実行するQTウィジェットを作成できますか?

私はGoogleで多くの検索をしていますが、私のQに答えが見つかりませんでした。
誰でもお手伝いできますか?私は正しい方法でいますか?
ありがとうございます!

答えて

8

3つの独立したアプリケーションがすべてQtで書かれていて、そのソースがある場合は、QtのGUIオブジェクトの子プロセスを通してそれらを統一する必要があります。

http://qt-project.org/doc/qt-4.8/objecttrees.html

http://qt-project.org/doc/qt-4.8/widgets-and-layouts.html

http://qt-project.org/doc/qt-4.8/mainwindows-mdi.html

あなたがそのようにそれらへのアクセスを持っていない場合は、何を話しているのは、サードパーティのウィンドウ管理のようなものです。これは、他のウィンドウアプリケーションの状態やサイズを操作する、Windowsエクスプローラのようなシェルを作成するのと同じようなものです。

Windowsの場合はSpy ++やAutoIt Spy、その他のOSの場合は同様のプログラムを使用し、クラス、ウィンドウのタイトルなど、制御したいウィンドウの識別マークを確認します。または、QProcess::startDetached()のようなものでexeを起動することもできます。そして、OS依存の呼び出しを使用して

http://qt-project.org/doc/qt-5.1/qtcore/qprocess.html#startDetached

は窓を制御します。 Qtライブラリには、サードパーティ製のウィンドウ用に組み込まれたこのようなものはなく、あなたが起動したQApplicationのものだけが組み込まれています。このようなことをAutoHotKeyやAHKで行う例はたくさんあります。これは、Windows環境で多くのことを自動化するために作られたスクリプティング言語であり、Mac用のポートもあります(私はMacポートを自分で試していませんが)。

あなたはこのような呼び出しで、おそらくあなたの窓を見つけることを見ているので、最後に:

#include <windows.h> 

HWND hwnd_1 = ::FindWindow("Window_Class", "Window Name"); 
LONG retVal = GetWindowLongA(hwnd_1, GWL_STYLE); // to query the state of the window 

そして、そのようにウィンドウの位置や状態を操作:

::MoveWindow(hwnd_1, x, y, width, height, TRUE); 
::ShowWindow(hwnd_1, SW_SHOWMAXIMIZED); 

あなたはすることができます操作しているウィンドウに対してウィンドウフラグを正しく設定すると、制御しているウィンドウの上部にウィジェットを描画することもできます。

transparent QLabel with a pixmap

Cannot get QSystemTrayIcon to work correctly with activation reason

このすべてを行う際に、Windowsで出てくるいくつかの落とし穴は、彼らはあなたが期待するものとは異なるスケーリング表示を設定するときにWindows UIの癖を見つけ、そしてもしれあなたはタスクバーでうまくプレイし、操作しているプログラムのすべてのモーダルウィンドウを扱いたいと思う。

全体的に、それは可能です。 Qtはこれらのコマンドを実行するための素敵なインターフェースを作成しますが、最終的には美しく信頼性の高いウィンドウマネージャーでそれを得るために多くの作業とデバッグを見ています。

希望に役立ちます。

+1

まずはお返事ありがとうございます。誰も私に答えられないと思い始めました。私はソースコードにアクセスできません。 2 Q:QWidget :: createWindowContainer()について何を知っていますか?機能、それはすべての仕事をすることがありますか? 2.あなたのソリューションがWindowsに移植する必要がある場合 - 多分それは価値がありません - 短絡した解決策は.NETのアプリケーションをWindows用に書いていますが、私はLinux-Ubuntuについて知らないのですか? – RRR

+0

私は前に 'createWindowContainer'を使っていません。それは、シーングラフやQt QuickやOpenGLウィンドウのように、他のQWidgetsで動作する完全なウィンドウデコレーションを持つような、あらゆる種類の 'QWindow'をアップグレードするためのショートカットのようです。それはちょうどHWNDのIDを取ることができるように見えません... http://blog.qt.digia.com/blog/2013/02/19/introducing-qwidgetcreatewindowcontainer/ – phyatt

+0

ウィンドウを扱うことはそれほど難しくありません。それは研究と仕事を必要としますが、Windowsでそれらを操作して操作するには、数時間以上かかることはありません。私はまだLinuxとOSXでそれをやっていないが、それはちょうどその場所で適切な呼び出しを得るための問題でなければならない。 – phyatt

6

私はそれを自分で試したことがないが、Qtの5.1のドキュメントから、私はcreateWindowContainerと組み込み可能である必要があり、あなたにQWindowを与えるQWindow :: fromId(WID ID)を、しようとするだろう:

QWindow * QWindow :: fromWinId(WId id)[静的]別のプロセスによって作成されたウィンドウまたはQt以下のネイティブライブラリ を使用してローカルの 表現を作成します。

は、ネイティブウィンドウへのハンドル番号が与えられると、本方法は、のsetParent()とsetTransientParent()のようなメソッド を呼び出すときにウィンドウを表すために使用することができるQWindow オブジェクトを作成します。これは、それをサポートしている プラットフォーム上で、コンテナ内にウィンドウを埋め込むために、または別のプロセスによって作成されたウィンドウの上にウィンドウスティックを貼り付けるために使用できます( )。

ただし、保証はありません。 :-)

+0

ハンドルIDを外部アプリケーション(QProcessから作成)とどのくらい正確に取得できますか? – user3079474

+0

バギー! https://bugreports.qt.io/browse/QTBUG-40320 :) – mlvljr

関連する問題