FC2ブログ
冴えないポスドクの備忘録
ポスドクになっちゃった。最近めっきり更新してないから、日記というかプログラムとかメモとかおいておこうかな
プロフィール

asu2ikl4

Author:asu2ikl4
ポスドク
物理学専攻
テーマ「高エネルギー素粒子原子核物理」、「放射線測定器開発」など

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

検索フォーム

RSSリンクの表示

リンク

このブログをリンクに追加する

ブロとも申請フォーム

この人とブロともになる

QRコード

QR

スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ROOTでGUI実装 その1
ROOTのGUI builderを使えば簡単にGUIが実装できるらしい。

今回の目標はGUIの基本なるフレームやボタン配置、
そしてボタンを押したらアクションするように実装すること

手順1. ROOTのTBrowserを開いて[Tools] -> [ROOT GUIBuilder]を起動する。
%root
[0] TBrowser tb


85.png

手順2. 適当にフレームとボタンを配置していこう。

86.png


切りがいいところで、保存。
保存したファイルの中身を確認すると、何だかよくわからないものがたくさん書かれている。


// Mainframe macro generated from application: /usr/local/root/bin/root.exe
// By ROOT version 5.34/18 on 2015-06-21 19:55:34

#ifndef ROOT_TGDockableFrame
#include "TGDockableFrame.h"
#endif
#ifndef ROOT_TGMenu
#include "TGMenu.h"
#endif
#ifndef ROOT_TGMdiDecorFrame
#include "TGMdiDecorFrame.h"
#endif
#ifndef ROOT_TG3DLine
#include "TG3DLine.h"
#endif
#ifndef ROOT_TGMdiFrame
#include "TGMdiFrame.h"
#endif
#ifndef ROOT_TGMdiMainFrame
#include "TGMdiMainFrame.h"
#endif
#ifndef ROOT_TGMdiMenu
#include "TGMdiMenu.h"
#endif
#ifndef ROOT_TGListBox
#include "TGListBox.h"
#endif
#ifndef ROOT_TGNumberEntry

.
.
.
void textGUI(){
TGMainFrame *fMainFrame1619 = new TGMainFrame(gClient->GetRoot(),10,10,kMainFrame | kVerticalFrame);
fMainFrame1619->SetName("fMainFrame1619");
fMainFrame1619->SetLayoutBroken(kTRUE);
TGCompositeFrame *fMainFrame1452 = new TGCompositeFrame(fMainFrame1619,490,372,kVerticalFrame);
fMainFrame1452->SetName("fMainFrame1452");
fMainFrame1452->SetLayoutBroken(kTRUE);
// embedded canvas
TRootEmbeddedCanvas *fRootEmbeddedCanvas1322 = new TRootEmbeddedCanvas(0,fMainFrame1452,280,120);
fRootEmbeddedCanvas1322->SetName("fRootEmbeddedCanvas1322");
Int_t wfRootEmbeddedCanvas1322 = fRootEmbeddedCanvas1322->GetCanvasWindowId();
TCanvas *c123 = new TCanvas("c123", 10, 10, wfRootEmbeddedCanvas1322);
fRootEmbeddedCanvas1322->AdoptCanvas(c123);
fMainFrame1452->AddFrame(fRootEmbeddedCanvas1322, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
fRootEmbeddedCanvas1322->MoveResize(128,16,280,120);
TGTextButton *fTextButton1373 = new TGTextButton(fMainFrame1452,"OK");
fTextButton1373->SetTextJustify(36);
fTextButton1373->SetMargins(0,0,0,0);
fTextButton1373->SetWrapLength(-1);
fTextButton1373->Resize(90,22);
fTextButton1373->Connect("Clicked()","fMainFrame1452","","func1()");
.
.
.



いらないものを消していくと、


void textGUI(){
// main frame
fMainFrame = new TGMainFrame();
fMainFrame->SetName("fMainFrame");
fMainFrame->SetLayoutBroken(kTRUE);

// sub frame
SubFrame = new TGCompositeFrame(fMainFrame,490,120,kVerticalFrame);
SubFrame->SetName("SubFrame");
SubFrame->SetLayoutBroken(kTRUE);
fMainFrame->AddFrame(SubFrame, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
SubFrame->MoveResize(0,0,490,150);//sub frame x,y, width, height

// ボタン:OK
button_A = new TGTextButton(SubFrame,"OK");
button_A->MoveResize(8,72,90,22);//引数: x,y,width,height [bit]
button_A->Connect("Clicked()", 0, 0, "func1()");

// ボタン:cancel
button_B = new TGTextButton(SubFrame,"cancel");
button_B->Connect("Clicked()", 0, 0, "clear_canvas()");
button_B->MoveResize(8,96,90,22);//引数: x,y,width,height [bit]

//キャンパス
canv = new TRootEmbeddedCanvas(0,SubFrame,280,120);
canv->SetName("canv");
Int_t wcanv = canv->GetCanvasWindowId();
c1 = new TCanvas("c1",10,10,wcanv);
canv->AdoptCanvas(c1);
SubFrame->AddFrame(canv, new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2));
canv->MoveResize(192,8,280,140);//引数: x,y,width,height [bit]

fMainFrame->SetMWMHints(kMWMDecorAll, kMWMFuncAll, kMWMInputModeless);
fMainFrame->MapSubwindows();
fMainFrame->Resize(fMainFrame->GetDefaultSize());
fMainFrame->MapWindow();
fMainFrame->Resize(490,150);//window size
}

//関数
void func1(){
cout << "debug" << endl;
c1->cd();
hist=new TH1S("hist","hist",10,0,10);
hist->SetBinContent(0,10);
hist->SetBinContent(1,11);
hist->SetBinContent(2,20);
hist->SetBinContent(3,30);
hist->SetBinContent(4,100);
hist->SetBinContent(5,20);
hist->SetBinContent(6,10);
hist->SetBinContent(7,9);
hist->SetBinContent(8,10);
hist->SetBinContent(9,10);
hist->Draw();
c1->Update();
}

void clear_canvas(){
c1->Clear();
c1->Update();
}



ボタンの配置と関数とのコネクトなどはたった3行でできてしまう。
とりあえず出来たGUIを起動してみよう

%root -l textGUI.c
87.png


ボタンOKを押すと右のキャンバスにヒストグラムが書かれ、
cancelボタンを押すと消える単純な設計が出来上がった。



スポンサーサイト

コメント

コメントの投稿














管理者にだけ表示を許可する


トラックバック
トラックバック URL
http://koeq.blog.fc2.com/tb.php/9-595c1fe5
この記事にトラックバックする(FC2ブログユーザー)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。