[openrtm-beginners:00429] OpenRTM-aist(C++)でのQtの利用について

5 posts / 0 new
Last post
t_nagasawa
Offline
Last seen: 11 years 10 months ago
Joined: 2012-04-23 03:08
[openrtm-beginners:00429] OpenRTM-aist(C++)でのQtの利用について

OpenRTMメーリングリストの皆様名古屋大学大学院修士課程の長澤と申します.OpenRTM-aist(C++) 1.0.2上でのGUIライブラリQtの利用について質問がありメールさせていだたきました.センサ情報をQtを用いて表示させたいと考え,Qtの管理クラスであるQApplicationと,
QWidgetを継承した自作クラスMyQtのポインタをRTCのクラスに下記のように追加しました.------------------------------------------------------------------------------------------------------class PointCloudViewer : public RTC::DataFlowComponentBase
{public: /*! * @brief constructor * @param manager Maneger Object
*/ PointCloudViewer(RTC::Manager* manager);///////////////////中略/////////////////////public:
QApplication *app; //Qt管理クラス myQt *window; //自作クラス};------------------------------------------------------------------------------------------------------
そしてappとwindowにnew演算子を用いて,onInitialize()でインスタンスを割り当て,onExecute()かcoil::Timer上で,イベント処理関数のapp->processEvents()を実行させようと考えました.しかしビルドは通るのですが,QtのGUIを操作することはできませんでした.
そこでonActivate()でインスタンスを割り当てたところ,問題なく操作できたのですが,コンソール上で下記のWarningが表示されます.WARNING: QApplication was not created in the main() thread.
QApplicationのインスタンスをmain()内で作成し,そのアドレスをRTC内に伝えればいいのではないかと考えたのですがその方法がわかりません.

Undefined
shinji.k
Offline
Last seen: Never ago
Joined: 2013-04-30 01:00
[openrtm-beginners:00430] OpenRTM-aist(C++)でのQtの利用について

長澤様

栗原と申します.

Qtに関しては詳しくないのですが,
メインスレッドから制御しないといけないアプリを使用するコンポーネント
(RTC)を作成した経験がございますので,参考までにコメントさせていた
だきます.

まず,今回のように,Qtなどメインスレッドから処理を開始する必要があるRTC
を作成する場合,<コンポーネント名>Comp.cppのmain()関数内の
manager->runManager();となっている箇所を
manager->runmanager(true)のようにし,その後で使用したいアプリケーション
のメインループを呼び出すといった使われ方が多いようです.

以下に,立命館大学の方が作成されたQtを使ったコンポーネントがありますので,
参考にされてみるのもよいかと思います.

http://openrtm.sakura.ne.jp/cgi-bin/wiki/wiki.cgi/2010/2B13?page=%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB

http://openrtm.sakura.ne.jp/cgi-bin/wiki/wiki.cgi/2010/2B13?page=%A5%C0%A5%A6%A5%F3%A5%ED%A1%BC%A5%C9&file=RMC%2D1%2E2%2E1%2Dwin32%2DOpenRTM%2Ezip&action=ATTACH

以上,宜しくお願い致します.

2013年4月28日 17:48 長澤 哲弥(Nagasawa Tetsuya) :
> OpenRTMメーリングリストの皆様
>
> 名古屋大学大学院修士課程の長澤と申します.
> OpenRTM-aist(C++) 1.0.2上でのGUIライブラリQtの利用について質問がありメールさせていだたきました.
>
> センサ情報をQtを用いて表示させたいと考え,Qtの管理クラスであるQApplicationと,
> QWidgetを継承した自作クラスMyQtのポインタをRTCのクラスに下記のように追加しました.

Ando Noriaki
Offline
Last seen: 1 year 9 months ago
Joined: 2011-09-04 17:20
[openrtm-beginners:00431] OpenRTM-aist(C++)でのQtの利用について

長澤さん
栗原さん<解説ありがとうございます。

安藤です

#beginnersは過疎ってるので、usersのほうが答えてもらえる確率が高いです。

C++で参考になるコードはちょっとなかったのですが、Python版の
サンプルに似たような応用例がありました。

Pythonのサンプルとして付属しているGUIジョイスティック
http://svn.openrtm.org/OpenRTM-aist-Python/trunk/OpenRTM-aist-Python/OpenRTM_aist/examples/TkJoyStick/TkJoyStickComp.py

移動ロボットのシンプルなシミュレータのサンプル
http://svn.openrtm.org/OpenRTM-aist-Python/trunk/OpenRTM-aist-Python/OpenRTM_aist/examples/MobileRobotCanvas/TkMobileRobotSimulator.py

などが栗原さんが言われたようなことをしています。

TkJoystickCompのサンプルのmain関数ですが、以下のようになっています。

def main():
tkJoyCanvas = tkjoystick.TkJoystick() # GUIオブジェクトを作成
tkJoyCanvas.master.title("TkJoystick")
mgr = OpenRTM_aist.Manager.init(sys.argv) # RTCマネージャを作成
mgr.activateManager() #マネージャを活性化

# コンポーネントの登録
profile = OpenRTM_aist.Properties(defaults_str=tkjoystick_spec)
mgr.registerFactory(profile,
TkJoyStick,
OpenRTM_aist.Delete)
# コンポーネントの生成
comp = mgr.createComponent("TkJoyStick")

# このコンポーネントにはset_posというメンバ関数があり、
# GUIジョイスティックの座標をコンポーネントに渡すために使用される。
# TkJoystickのGUIのupdateイベントが呼ばれるときに、
# こいつを呼ぶようにコールバックとしてセットする。
tkJoyCanvas.set_on_update(comp.set_pos)
mgr.runManager(True) # マネージャのrunManagerの引数にTrueを渡してnon-blockモードでマネージャを起動
tkJoyCanvas.mainloop() # PythonのGUIのメインループに入る。

if __name__ == "__main__":
main()

ポイントとしては、

1) コンポーネントの中からGUIのメインループ関数を呼んだり、
  GUIオブジェクトを生成したりはしないほうが無難

 GUIツールキットの中には、mainスレッドから呼ばなければならないものや、
 同一のスレッドから呼ばれることを前提としている関数などを持つものがある。
 RTCはonInitialize/onFinalizeを呼ぶスレッドと、onExecute/onActivated/onDeactivated その他
 を呼ぶスレッドは異なります。また、onExecute他の関数は複数のスレッドから同時に
 呼ばれる可能性すらあります。GUIスレッドとRTCとは別に扱ったほうが
 トラブルは少ないでしょう。

2)GUIとRTCのデータのやり取りは、RTCにそのための関数を追加することで対応

 上記のような理由から、GUIとコンポーネントは切り離したほうがよいのですが、
 GUI側とRTCとデータのやり取りをしなければならない時に困ります。
 通常RTCにデータのやり取りをするためのインターフェースを別途継承させて、
 createComponentで取得したコンポーネントへのポインタを取得してGUI
 側からデータを取得したり、データを与えたりします。

class IMyInterface
{
public:
virtual int getData() = 0;
virtual void setData(double x, double y) = 0;
};

class MyComponent
: public IMyInterface,
public RTC::DataFlowComponentBase
{
: コンポーネントの定義
public:
virtual int getData()
{
coil::Guard guard(m_outdatalock);
return m_outdata;
}
virtual void setData(double x, double y)
{
coil::Guard guard(m_indatalock);
m_indata.x = x;
m_indata.y = y;
}
};

このようにコンポーネントを実装しておいてから、

RTObject_impl* rtobj = mgr.createComponent("MyComponent");
IMyInterface* comp = dynamic_cast(rtobj);
if (comp == 0) { abort(); }
mgr.runManager(true);
gui.mainloop();

そして
: GUIのコントロール内で
std::cout << "out data: " << comp->getData() << std::endl; // データを取得
comp->setData(1.0, 2.0); // データを入力

のようにRTCとデータのやり取りをします。

3) RTCとGUIのコントロールやウィジェットを1対1対応にしておくとわかりやすい

ただし、GUIコントロールとRTCはそれぞれ生成方法が異なるので、別々に
生成して、上述したようにRTCに実装したデータ入出力関数を通じてGUI
コントロールと結びつけたほうがよいでしょう。

移動ロボットのシンプルなシミュレータのサンプルでは、移動ロボットオブジェクトと
それに対応するRTCを動的に増やしたり減らしたりしています。
http://svn.openrtm.org/OpenRTM-aist-Python/trunk/OpenRTM-aist-Python/OpenRTM_aist/examples/MobileRobotCanvas/TkMobileRobotSimulator.py

以上、参考にしていただければ幸いです。
http://openrtm.org/openrtm/ja/node/5317

2013年4月30日 0:43 shinji.k :
> 長澤様
>
> 栗原と申します.
>
> Qtに関しては詳しくないのですが,
> メインスレッドから制御しないといけないアプリを使用するコンポーネント
> (RTC)を作成した経験がございますので,参考までにコメントさせていた
> だきます.
>
> まず,今回のように,Qtなどメインスレッドから処理を開始する必要があるRTC
> を作成する場合,<コンポーネント名>Comp.cppのmain()関数内の
> manager->runManager();となっている箇所を
> manager->runmanager(true)のようにし,その後で使用したいアプリケーション
> のメインループを呼び出すといった使われ方が多いようです.
>
> 以下に,立命館大学の方が作成されたQtを使ったコンポーネントがありますので,
> 参考にされてみるのもよいかと思います.
>
> http://openrtm.sakura.ne.jp/cgi-bin/wiki/wiki.cgi/2010/2B13?page=%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB
>
> http://openrtm.sakura.ne.jp/cgi-bin/wiki/wiki.cgi/2010/2B13?page=%A5%C0%A5%A6%A5%F3%A5%ED%A1%BC%A5%C9&file=RMC%2D1%2E2%2E1%2Dwin32%2DOpenRTM%2Ezip&action=ATTACH
>
>
> 以上,宜しくお願い致します.
>
>
>
> 2013年4月28日 17:48 長澤 哲弥(Nagasawa Tetsuya) :
>> OpenRTMメーリングリストの皆様
>>
>> 名古屋大学大学院修士課程の長澤と申します.
>> OpenRTM-aist(C++) 1.0.2上でのGUIライブラリQtの利用について質問がありメールさせていだたきました.
>>
>> センサ情報をQtを用いて表示させたいと考え,Qtの管理クラスであるQApplicationと,
>> QWidgetを継承した自作クラスMyQtのポインタをRTCのクラスに下記のように追加しました.

t_nagasawa
Offline
Last seen: 11 years 10 months ago
Joined: 2012-04-23 03:08
[openrtm-beginners:00432] OpenRTM-aist(C++)でのQtの利用について

栗原様安藤様長澤です.とても丁寧にありがとうございます.まだ完全理解したわけではないのですが,Python版の例を参考にPyQtを利用して所望のRTCを作ることができました.非常に感謝しています.私のようにプログラミングスキルの低い機械系の学生にとっては,
GUI等の複雑なものに関してはC++版よりPython版の方が問題にはまりにくいかもしれません.このたびは本当にありがとうございました.今後もぜひ参考にしたいと思います.2013年4月30日 17:04 Ando Noriaki <n-ando@aist.go.jp>:

長澤さん
栗原さん<解説ありがとうございます。

安藤です

#beginnersは過疎ってるので、usersのほうが答えてもらえる確率が高いです。

C++で参考になるコードはちょっとなかったのですが、Python版の
サンプルに似たような応用例がありました。

Pythonのサンプルとして付属しているGUIジョイスティック
http://svn.openrtm.org/OpenRTM-aist-Python/trunk/OpenRTM-aist-Python/OpenRTM_aist/examples/TkJoyStick/TkJoyStickComp.py

移動ロボットのシンプルなシミュレータのサンプル
http://svn.openrtm.org/OpenRTM-aist-Python/trunk/OpenRTM-aist-Python/OpenRTM_aist/examples/MobileRobotCanvas/TkMobileRobotSimulator.py

などが栗原さんが言われたようなことをしています。

TkJoystickCompのサンプルのmain関数ですが、以下のようになっています。

 def main():
   tkJoyCanvas = tkjoystick.TkJoystick() # GUIオブジェクトを作成
   tkJoyCanvas.master.title("TkJoystick")
   mgr = OpenRTM_aist.Manager.init(sys.argv) # RTCマネージャを作成
   mgr.activateManager() #マネージャを活性化

   # コンポーネントの登録
   profile = OpenRTM_aist.Properties(defaults_str=tkjoystick_spec)
   mgr.registerFactory(profile,
                       TkJoyStick,
                       OpenRTM_aist.Delete)
   # コンポーネントの生成
   comp = mgr.createComponent("TkJoyStick")

   # このコンポーネントにはset_posというメンバ関数があり、
   # GUIジョイスティックの座標をコンポーネントに渡すために使用される。
   # TkJoystickのGUIのupdateイベントが呼ばれるときに、
   # こいつを呼ぶようにコールバックとしてセットする。
   tkJoyCanvas.set_on_update(comp.set_pos)
   mgr.runManager(True) # マネージャのrunManagerの引数にTrueを渡してnon-blockモードでマネージャを起動
   tkJoyCanvas.mainloop() # PythonのGUIのメインループに入る。

 if __name__ == "__main__":
   main()

ポイントとしては、

1) コンポーネントの中からGUIのメインループ関数を呼んだり、
  GUIオブジェクトを生成したりはしないほうが無難

 GUIツールキットの中には、mainスレッドから呼ばなければならないものや、
 同一のスレッドから呼ばれることを前提としている関数などを持つものがある。
 RTCはonInitialize/onFinalizeを呼ぶスレッドと、onExecute/onActivated/onDeactivated その他
 を呼ぶスレッドは異なります。また、onExecute他の関数は複数のスレッドから同時に
 呼ばれる可能性すらあります。GUIスレッドとRTCとは別に扱ったほうが
 トラブルは少ないでしょう。

2)GUIとRTCのデータのやり取りは、RTCにそのための関数を追加することで対応

 上記のような理由から、GUIとコンポーネントは切り離したほうがよいのですが、
 GUI側とRTCとデータのやり取りをしなければならない時に困ります。
 通常RTCにデータのやり取りをするためのインターフェースを別途継承させて、
 createComponentで取得したコンポーネントへのポインタを取得してGUI
 側からデータを取得したり、データを与えたりします。

class IMyInterface
{
public:
    virtual int getData() = 0;
    virtual void setData(double x, double y) = 0;
};

class MyComponent
 : public IMyInterface,
   public RTC::DataFlowComponentBase
{
 : コンポーネントの定義
public:
    virtual int getData()
    {
        coil::Guard guard(m_outdatalock);
        return m_outdata;
     }
   virtual void setData(double x, double y)
    {
        coil::Guard guard(m_indatalock);
        m_indata.x = x;
        m_indata.y = y;
    }
};

このようにコンポーネントを実装しておいてから、

  RTObject_impl* rtobj = mgr.createComponent("MyComponent");
  IMyInterface* comp = dynamic_cast<IMyInterface*>(rtobj);
  if (comp == 0) { abort(); }
  mgr.runManager(true);
  gui.mainloop();

そして
   : GUIのコントロール内で
  std::cout << "out data: " << comp->getData() << std::endl; // データを取得
  comp->setData(1.0, 2.0); // データを入力

 のようにRTCとデータのやり取りをします。

3) RTCとGUIのコントロールやウィジェットを1対1対応にしておくとわかりやすい

ただし、GUIコントロールとRTCはそれぞれ生成方法が異なるので、別々に
生成して、上述したようにRTCに実装したデータ入出力関数を通じてGUI
コントロールと結びつけたほうがよいでしょう。

移動ロボットのシンプルなシミュレータのサンプルでは、移動ロボットオブジェクトと
それに対応するRTCを動的に増やしたり減らしたりしています。
http://svn.openrtm.org/OpenRTM-aist-Python/trunk/OpenRTM-aist-Python/OpenRTM_aist/examples/MobileRobotCanvas/TkMobileRobotSimulator.py

以上、参考にしていただければ幸いです。
http://openrtm.org/openrtm/ja/node/5317

2013年4月30日 0:43 shinji.k <shinji0608@gmail.com>:
> 長澤様
>
> 栗原と申します.
>
> Qtに関しては詳しくないのですが,
> メインスレッドから制御しないといけないアプリを使用するコンポーネント
> (RTC)を作成した経験がございますので,参考までにコメントさせていた
> だきます.
>
> まず,今回のように,Qtなどメインスレッドから処理を開始する必要があるRTC
> を作成する場合,<コンポーネント名>Comp.cppのmain()関数内の
> manager->runManager();となっている箇所を
> manager->runmanager(true)のようにし,その後で使用したいアプリケーション
> のメインループを呼び出すといった使われ方が多いようです.
>
> 以下に,立命館大学の方が作成されたQtを使ったコンポーネントがありますので,
> 参考にされてみるのもよいかと思います.
>
> http://openrtm.sakura.ne.jp/cgi-bin/wiki/wiki.cgi/2010/2B13?page=%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB

>
> http://openrtm.sakura.ne.jp/cgi-bin/wiki/wiki.cgi/2010/2B13?page=%A5%C0%A5%A6%A5%F3%A5%ED%A1%BC%A5%C9&file=RMC%2D1%2E2%2E1%2Dwin32%2DOpenRTM%2Ezip&action=ATTACH

>
>
> 以上,宜しくお願い致します.
>
>
>
> 2013年4月28日 17:48 長澤 哲弥(Nagasawa Tetsuya) <t_nagasawa@nuem.nagoya-u.ac.jp>:
>> OpenRTMメーリングリストの皆様
>>
>> 名古屋大学大学院修士課程の長澤と申します.
>> OpenRTM-aist(C++) 1.0.2上でのGUIライブラリQtの利用について質問がありメールさせていだたきました.
>>
>> センサ情報をQtを用いて表示させたいと考え,Qtの管理クラスであるQApplicationと,
>> QWidgetを継承した自作クラスMyQtのポインタをRTCのクラスに下記のように追加しました.
>> ------------------------------------------------------------------------------------------------------
>> class PointCloudViewer
>> : public RTC::DataFlowComponentBase
>> {
>> public:
>> /*!
>> * @brief constructor
>> * @param manager Maneger Object
>> */
>> PointCloudViewer(RTC::Manager* manager);
>> ///////////////////中略/////////////////////
>> public:
>>
>> QApplication *app; //Qt管理クラス
>> myQt *window; //自作クラス
>>
>> };
>> ------------------------------------------------------------------------------------------------------
>> そしてappとwindowにnew演算子を用いて,onInitialize()でインスタンスを割り当て,
>> onExecute()かcoil::Timer上で,イベント処理関数のapp->processEvents()を実行させようと考えました.
>> しかしビルドは通るのですが,QtのGUIを操作することはできませんでした.
>>
>> そこでonActivate()でインスタンスを割り当てたところ,問題なく操作できたのですが,
>> コンソール上で下記のWarningが表示されます.
>> WARNING: QApplication was not created in the main() thread.
>>
>> QApplicationのインスタンスをmain()内で作成し,そのアドレスをRTC内に伝えればいいのではないかと考えたのですが
>> その方法がわかりません.
>>
>>

Ando Noriaki
Offline
Last seen: 1 year 9 months ago
Joined: 2011-09-04 17:20
[openrtm-users 02790] [openrtm-beginners:00430] OpenRTM-aist(C

長澤さん
栗原さん<解説ありがとうございます。

安藤です

#beginnersは過疎ってるので、usersのほうが答えてもらえる確率が高いです。

C++で参考になるコードはちょっとなかったのですが、Python版の
サンプルに似たような応用例がありました。

Pythonのサンプルとして付属しているGUIジョイスティック
http://svn.openrtm.org/OpenRTM-aist-Python/trunk/OpenRTM-aist-Python/OpenRTM_aist/examples/TkJoyStick/TkJoyStickComp.py

移動ロボットのシンプルなシミュレータのサンプル
http://svn.openrtm.org/OpenRTM-aist-Python/trunk/OpenRTM-aist-Python/OpenRTM_aist/examples/MobileRobotCanvas/TkMobileRobotSimulator.py

などが栗原さんが言われたようなことをしています。

TkJoystickCompのサンプルのmain関数ですが、以下のようになっています。

def main():
tkJoyCanvas = tkjoystick.TkJoystick() # GUIオブジェクトを作成
tkJoyCanvas.master.title("TkJoystick")
mgr = OpenRTM_aist.Manager.init(sys.argv) # RTCマネージャを作成
mgr.activateManager() #マネージャを活性化

# コンポーネントの登録
profile = OpenRTM_aist.Properties(defaults_str=tkjoystick_spec)
mgr.registerFactory(profile,
TkJoyStick,
OpenRTM_aist.Delete)
# コンポーネントの生成
comp = mgr.createComponent("TkJoyStick")

# このコンポーネントにはset_posというメンバ関数があり、
# GUIジョイスティックの座標をコンポーネントに渡すために使用される。
# TkJoystickのGUIのupdateイベントが呼ばれるときに、
# こいつを呼ぶようにコールバックとしてセットする。
tkJoyCanvas.set_on_update(comp.set_pos)
mgr.runManager(True) # マネージャのrunManagerの引数にTrueを渡してnon-blockモードでマネージャを起動
tkJoyCanvas.mainloop() # PythonのGUIのメインループに入る。

if __name__ == "__main__":
main()

ポイントとしては、

1) コンポーネントの中からGUIのメインループ関数を呼んだり、
  GUIオブジェクトを生成したりはしないほうが無難

 GUIツールキットの中には、mainスレッドから呼ばなければならないものや、
 同一のスレッドから呼ばれることを前提としている関数などを持つものがある。
 RTCはonInitialize/onFinalizeを呼ぶスレッドと、onExecute/onActivated/onDeactivated その他
 を呼ぶスレッドは異なります。また、onExecute他の関数は複数のスレッドから同時に
 呼ばれる可能性すらあります。GUIスレッドとRTCとは別に扱ったほうが
 トラブルは少ないでしょう。

2)GUIとRTCのデータのやり取りは、RTCにそのための関数を追加することで対応

 上記のような理由から、GUIとコンポーネントは切り離したほうがよいのですが、
 GUI側とRTCとデータのやり取りをしなければならない時に困ります。
 通常RTCにデータのやり取りをするためのインターフェースを別途継承させて、
 createComponentで取得したコンポーネントへのポインタを取得してGUI
 側からデータを取得したり、データを与えたりします。

class IMyInterface
{
public:
virtual int getData() = 0;
virtual void setData(double x, double y) = 0;
};

class MyComponent
: public IMyInterface,
public RTC::DataFlowComponentBase
{
: コンポーネントの定義
public:
virtual int getData()
{
coil::Guard guard(m_outdatalock);
return m_outdata;
}
virtual void setData(double x, double y)
{
coil::Guard guard(m_indatalock);
m_indata.x = x;
m_indata.y = y;
}
};

このようにコンポーネントを実装しておいてから、

RTObject_impl* rtobj = mgr.createComponent("MyComponent");
IMyInterface* comp = dynamic_cast(rtobj);
if (comp == 0) { abort(); }
mgr.runManager(true);
gui.mainloop();

そして
: GUIのコントロール内で
std::cout << "out data: " << comp->getData() << std::endl; // データを取得
comp->setData(1.0, 2.0); // データを入力

のようにRTCとデータのやり取りをします。

3) RTCとGUIのコントロールやウィジェットを1対1対応にしておくとわかりやすい

ただし、GUIコントロールとRTCはそれぞれ生成方法が異なるので、別々に
生成して、上述したようにRTCに実装したデータ入出力関数を通じてGUI
コントロールと結びつけたほうがよいでしょう。

移動ロボットのシンプルなシミュレータのサンプルでは、移動ロボットオブジェクトと
それに対応するRTCを動的に増やしたり減らしたりしています。
http://svn.openrtm.org/OpenRTM-aist-Python/trunk/OpenRTM-aist-Python/OpenRTM_aist/examples/MobileRobotCanvas/TkMobileRobotSimulator.py

以上、参考にしていただければ幸いです。
http://openrtm.org/openrtm/ja/node/5317

2013年4月30日 0:43 shinji.k :
> 長澤様
>
> 栗原と申します.
>
> Qtに関しては詳しくないのですが,
> メインスレッドから制御しないといけないアプリを使用するコンポーネント
> (RTC)を作成した経験がございますので,参考までにコメントさせていた
> だきます.
>
> まず,今回のように,Qtなどメインスレッドから処理を開始する必要があるRTC
> を作成する場合,<コンポーネント名>Comp.cppのmain()関数内の
> manager->runManager();となっている箇所を
> manager->runmanager(true)のようにし,その後で使用したいアプリケーション
> のメインループを呼び出すといった使われ方が多いようです.
>
> 以下に,立命館大学の方が作成されたQtを使ったコンポーネントがありますので,
> 参考にされてみるのもよいかと思います.
>
> http://openrtm.sakura.ne.jp/cgi-bin/wiki/wiki.cgi/2010/2B13?page=%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB
>
> http://openrtm.sakura.ne.jp/cgi-bin/wiki/wiki.cgi/2010/2B13?page=%A5%C0%A5%A6%A5%F3%A5%ED%A1%BC%A5%C9&file=RMC%2D1%2E2%2E1%2Dwin32%2DOpenRTM%2Ezip&action=ATTACH
>
>
> 以上,宜しくお願い致します.
>
>
>
> 2013年4月28日 17:48 長澤 哲弥(Nagasawa Tetsuya) :
>> OpenRTMメーリングリストの皆様
>>
>> 名古屋大学大学院修士課程の長澤と申します.
>> OpenRTM-aist(C++) 1.0.2上でのGUIライブラリQtの利用について質問がありメールさせていだたきました.
>>
>> センサ情報をQtを用いて表示させたいと考え,Qtの管理クラスであるQApplicationと,
>> QWidgetを継承した自作クラスMyQtのポインタをRTCのクラスに下記のように追加しました.
>> ------------------------------------------------------------------------------------------------------
>> class PointCloudViewer
>> : public RTC::DataFlowComponentBase
>> {
>> public:
>> /*!
>> * @brief constructor
>> * @param manager Maneger Object
>> */
>> PointCloudViewer(RTC::Manager* manager);
>> ///////////////////中略/////////////////////
>> public:
>>
>> QApplication *app; //Qt管理クラス
>> myQt *window; //自作クラス
>>
>> };
>> ------------------------------------------------------------------------------------------------------
>> そしてappとwindowにnew演算子を用いて,onInitialize()でインスタンスを割り当て,
>> onExecute()かcoil::Timer上で,イベント処理関数のapp->processEvents()を実行させようと考えました.
>> しかしビルドは通るのですが,QtのGUIを操作することはできませんでした.
>>
>> そこでonActivate()でインスタンスを割り当てたところ,問題なく操作できたのですが,
>> コンソール上で下記のWarningが表示されます.
>> WARNING: QApplication was not created in the main() thread.
>>
>> QApplicationのインスタンスをmain()内で作成し,そのアドレスをRTC内に伝えればいいのではないかと考えたのですが
>> その方法がわかりません.
>>
>>

Log in or register to post comments

Download

latest Releases : 2.0.0-RELESE

2.0.0-RELESE Download page

Number of Projects

Choreonoid

Motion editor/Dynamics simulator

OpenHRP3

Dynamics simulator

OpenRTP

Integrated Development Platform

AIST RTC collection

RT-Components collection by AIST

TORK

Tokyo Opensource Robotics Association

DAQ-Middleware

Middleware for DAQ (Data Aquisition) by KEK