ROOT Version: 6.20/04
Platform: Fedora 31
Compiler: gcc version 9.3.1 20200317 (Red Hat 9.3.1-1) (GCC)
Dear co-rooters,
I am trying to build a simple GUI in which the 3 quarters of the window will be occupied by a canvas and the one quarter will be button and user input values.
To do that I decided to divide a main TGMainFrame
in two TGVerticalFrame
s, left and right. The right one will contain the TRootEmbeddedCanvas
whereas the left one will be composed of TGGroupFrame
s , each on of those will have TGNumberEntry
and TGTextButton
s for user interaction with the GUI.
One of the problems that I am facing is that I cannot seem to be able to specify the dimensions of the widgets. Whatever I do, even using Resize()
or kFitWidth | kFitHeight
, the widget always take up the full dimensions that are provided to them i.e. 50% of the window’s width for the 2 TGVerticalFrame
s, 25% of the window’s height for the TGGroupFrame
s in the left frame etc, as shown in the following picture.
Is there a way to specify the space each widget will take?
Thanks in advnace!
The code to reproduce what I am getting is the following.
#include <TGClient.h>
#include <TCanvas.h>
#include <TF1.h>
#include <TRandom.h>
#include <TGButton.h>
#include <TGFrame.h>
#include "TGNumberEntry.h"
#include <TRootEmbeddedCanvas.h>
#include <RQ_OBJECT.h>
class MainFrame {
RQ_OBJECT("MainFrame")
private:
TGMainFrame *fr_main;
TRootEmbeddedCanvas *emb_canvas;
TGGroupFrame *fr_runs, *fr_events, *fr_saves;
TGNumberEntry *entry_runs, *entry_events;
TGTextButton *but_runs_next, *but_runs_previous;
TGTextButton *but_events_next, *but_events_previous;
TGTextButton *but_save_ascii, *but_save_histo, *but_save_canvas;
TGTextButton *but_exit, *but_draw;
public:
MainFrame(const TGWindow *p, UInt_t width, UInt_t height);
virtual ~MainFrame();
void draw();
};
MainFrame::MainFrame(const TGWindow *p, UInt_t width, UInt_t height) {
TGFont *ufont = gClient->GetFont("-*-helvetica-bold-r-*-*-34-*-*-*-*-*-*-*");
ULong_t ucolor;
TGGC *uGC;
// Create a main frame
fr_main = new TGMainFrame(p, width, height, kMainFrame |
kRaisedFrame |
kOwnBackground |
kLHintsExpandX |
kLHintsExpandY |
kHorizontalFrame
);
//---- Left Frame - for buttons and user values
TGVerticalFrame *fr_left = new TGVerticalFrame(fr_main, 0.25*width, height, kChildFrame, kCyan);
// The 1st grouped frame - runs
TGGroupFrame *fr_runs = new TGGroupFrame(fr_left, "Run", kVerticalFrame, uGC->GetGC(), ufont->GetFontStruct() );
TGNumberEntry *box_run = new TGNumberEntry(fr_runs, (Double_t) 0, 10, -1, (TGNumberFormat::EStyle) 5);
fr_runs->AddFrame(box_run, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2) );
fr_left->AddFrame(fr_runs, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
// The 2nd grouped frame - events
TGGroupFrame *fr_event = new TGGroupFrame(fr_left, "Event", kVerticalFrame, uGC->GetGC(), ufont->GetFontStruct() );
TGNumberEntry *box_event = new TGNumberEntry(fr_event, (Double_t) 0, 10, -1, (TGNumberFormat::EStyle) 5);
fr_event->AddFrame(box_event, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2) );
fr_left->AddFrame(fr_event, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
// The 3rd grouped frame - Drawing the signal
TGGroupFrame *fr_draw = new TGGroupFrame(fr_left, "Draw", kHorizontalFrame, uGC->GetGC(), ufont->GetFontStruct() );
TGTextButton *but_draw_histo = new TGTextButton(fr_draw,"&Histo");
TGTextButton *but_draw_line = new TGTextButton(fr_draw,"&Line");
TGTextButton *but_draw_line_points = new TGTextButton(fr_draw,"&Line - Points");
fr_draw->AddFrame(but_draw_histo, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2) );
fr_draw->AddFrame(but_draw_line, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2) );
fr_draw->AddFrame(but_draw_line_points, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2) );
fr_left->AddFrame(fr_draw, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
// Test button to see the structure
TGTextButton *draw = new TGTextButton(fr_left,"&Draw");
draw->Connect("Clicked()", "MainFrame", this, "draw()");
fr_left->AddFrame(draw, new TGLayoutHints(kLHintsCenterX, 100, 100, 100, 100) );
fr_main->AddFrame(fr_left , new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10,10,10,10));
//---- Right frame - for the canvas
TGVerticalFrame *fr_right = new TGVerticalFrame(fr_main, 0.75*width, height, kChildFrame, kRed);
emb_canvas = new TRootEmbeddedCanvas("canvas", fr_right, 130, 180);
fr_right->AddFrame(emb_canvas, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10,10,10,10));
fr_main->AddFrame(fr_right , new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10,10,10,10));
// Set a name to the main frame
fr_main->SetWindowName("Signal viewer");
// Map all subwindows of main frame
fr_main->MapSubwindows();
// Initialize the layout algorithm
fr_main->Resize(fr_main->GetDefaultSize());
// Map main frame
fr_main->MapWindow();
}
void MainFrame::draw() {
// Draws function graphics in randomly chosen interval
TF1 *f1 = new TF1("f1","sin(x)/x",0,gRandom->Rndm()*10);
f1->SetLineWidth(3);
f1->Draw();
TCanvas *fCanvas = emb_canvas->GetCanvas();
fCanvas->cd();
fCanvas->Update();
}
MainFrame::~MainFrame() {
// Clean up used widgets: frames, buttons, layout hints
fr_main->Cleanup();
delete fr_main;
}
void test_beta() {
// Popup the GUI...
new MainFrame(gClient->GetRoot(), 500, 500);
}