Re: [ROOT] GUI question regarding using the "tab" to change widget focus

From: Michael T. Gericke (mgericke@leneut.lanl.gov)
Date: Tue Feb 18 2003 - 04:35:49 MET


Hi Fons,

Thank you for all your help. It is working fine now.

Thanks,

Michael


On 14 Feb 2003, Fons Rademakers wrote:

> Hi Michael,
> 
>   sorry I was not clear enough, the embedded object TGNumberEntryField
> derives from TGTextEntry and has the SetFocus() method. Therefore,
> create a TGNumberEntry object and then get its entry field via
> GetNumberEntry(). Notice that slot methods like FChangeFocus() must have
> a dictionary. So when run from the interpreter this is always the case
> but when from compiled code you have to first generate a dictionary for
> the class which has the FChangeFocus method.
> 
> Cheers, Fons.
> 
> 
> 
> On Fri, 2003-02-14 at 00:13, Michael T. Gericke wrote:
> > Hi Fons,
> > 
> > Thank you for your quick help.
> > Unfortunately, the TGNumberEntry class does not have a member
> > SetFocus(). So I changed from TGNumberEntry to TGTextEntry and
> > converted the strings to numbers after reading them.
> > But now when I run the program, I get the following error
> > message:
> > 
> > Error in <TQObject::CheckConnectArgs>: slot FChangeFocus() does not
> > exist
> > 
> > 
> > I believe that I included all the necessary function calls, judging from
> > you example.
> > 
> > Do you know what this means?
> > 
> > Thanks,
> > 
> > Michael Gericke
> > 
> > 
> > 
> > On Wed, 2003-02-12 at 16:04, Fons Rademakers wrote:
> > > Hi Michael,
> > > 
> > >   use the SetFocus() method of TGTextEntry of which TGNumberEntry
> > > derives. See the attached example.
> > > 
> > > Cheers, Fons.
> > > 
> > > 
> > > On Wed, 2003-02-12 at 22:58, Michael T. Gericke wrote:
> > > > Hi,
> > > > 
> > > > I was wondering if anyone knows how to force a dialog box
> > > > (TGTransientFrame) to switch focus from one of its widgets
> > > > (say a TGNumberEntry widget) to another using the "Tab"
> > > > button....
> > > > 
> > > > 
> > > > Thanks,
> > > > 
> > > > Michael Gericke
> > > -- 
> > > Org:    CERN, European Laboratory for Particle Physics.
> > > Mail:   1211 Geneve 23, Switzerland
> > > E-Mail: Fons.Rademakers@cern.ch              Phone: +41 22 7679248
> > > WWW:    http://root.cern.ch/~rdm/            Fax:   +41 22 7679480
> > > ----
> > > 
> > 
> > > 
> > > //--------------------------------------//
> > > // macro gui1.C                         //
> > > //--------------------------------------//
> > > #include <stdio.h>
> > > #include <stdlib.h>
> > > #include <iostream.h>
> > > 
> > > #include <TROOT.h>
> > > #include <TApplication.h>
> > > #include <TVirtualX.h>
> > > 
> > > #include <RQ_OBJECT.h>
> > > #include <TGFrame.h>
> > > #include <TGMenu.h>
> > > #include <TGTextEntry.h>
> > > #include <TGTextBuffer.h>
> > > #include <TGListBox.h>
> > > #include <TGFileDialog.h>
> > > #include <TSystem.h>
> > > #include <TEnv.h>
> > > 
> > > 
> > > const char *filetypes[] = { "All files",     "*",
> > >                             "ROOT files",    "*.root",
> > >                             "ROOT macros",   "*.C",
> > >                             0,               0 };
> > > 
> > > class TNewDlog {
> > > 
> > >    RQ_OBJECT()
> > > 
> > >    private:
> > >       TGMainFrame       *fMain;
> > >       TGCompositeFrame   *fFrameLT;
> > >       TGGroupFrame        *fFrameInfo;
> > >       TGTextEntry          *fNameF;
> > >       TGTextBuffer         *fBufF;
> > >       TGTextEntry          *fNameL;
> > >       TGTextBuffer         *fBufL;
> > >       TGGroupFrame        *fFrameDir;
> > > //      TGListBox            *fDir;
> > >       TGTextEntry          *fDir;
> > >       TGTextBuffer         *fBufDir;
> > >       TGButton             *fBrowseBtn;
> > >       TGCompositeFrame   *fFrameLB;
> > >       TGButton            *fOkBtn;
> > >       TGButton            *fCancelBtn;
> > > 
> > >    public:
> > >       TNewDlog(const TGWindow *vWindow,
> > >          UInt_t vWidth, UInt_t vHeight, UInt_t vOptions =
> > > kVerticalFrame);
> > >       virtual ~TNewDlog();
> > > 
> > >    // slots
> > >       void FCloseWindow();
> > >       void FBrowse();
> > >       void FPressOK();
> > >       void FCancel();
> > >       void FChangeFocus();
> > > };
> > > 
> > > 
> > > TNewDlog::TNewDlog(const TGWindow *vWindow,
> > >                            UInt_t vWidth, UInt_t vHeight, UInt_t
> > > vOptions)
> > > {
> > >    fMain = new TGMainFrame(vWindow, vWidth, vHeight, vOptions);
> > >    fMain->Connect("CloseWindow()", "TNewDlog", this, "FCloseWindow()");
> > > 
> > > // FrameLT for subframes
> > >    fFrameLT = new TGCompositeFrame(fMain, 200, 20, kVerticalFrame);
> > >    fMain->AddFrame(fFrameLT, new TGLayoutHints(kLHintsLeft |
> > > kLHintsTop));
> > > 
> > > // Subframe Project Info
> > >    fFrameInfo = new TGGroupFrame(fFrameLT, "Author Info",
> > > kVerticalFrame);
> > > //   fFrameInfo->SetLayoutManager(new TGTableLayout(fFrameInfo,2,2));
> > > //error
> > >    fFrameInfo->SetLayoutManager(new TGMatrixLayout(fFrameInfo,0,2,10));
> > >    fFrameLT->AddFrame(fFrameInfo,
> > >              new TGLayoutHints(kLHintsTop | kLHintsLeft |
> > > kLHintsExpandX,5,5,5,5));
> > > 
> > >    fFrameInfo->AddFrame(new TGLabel(fFrameInfo,new TGString("First
> > > Name")),
> > >              new TGLayoutHints(kLHintsTop | kLHintsLeft));
> > > 
> > >    fNameF = new TGTextEntry(fFrameInfo, fBufF = new TGTextBuffer(100),
> > > -1);
> > >    fNameF->Connect("ReturnPressed()", "TNewDlog", this, "FPressOK()");
> > >    fNameF->Connect("TabPressed()", "TNewDlog", this, "FChangeFocus()");
> > >    fFrameInfo->AddFrame(fNameF,
> > >                new TGLayoutHints(kLHintsTop | kLHintsLeft, 2, 2, 2, 2));
> > > 
> > >    fNameF->Resize(250, fNameF->GetDefaultHeight());
> > > 
> > >    fFrameInfo->AddFrame(new TGLabel(fFrameInfo,new TGString("Last
> > > Name")),
> > >              new TGLayoutHints(kLHintsTop | kLHintsLeft));
> > > 
> > >    fNameL = new TGTextEntry(fFrameInfo, fBufL = new TGTextBuffer(100),
> > > -1);
> > >    fNameL->Connect("ReturnPressed()", "TNewDlog", this, "FPressOK()");
> > >    fNameL->Connect("TabPressed()", "TNewDlog", this, "FChangeFocus()");
> > >    fFrameInfo->AddFrame(fNameL,
> > >                new TGLayoutHints(kLHintsTop | kLHintsLeft, 2, 2, 2, 2));
> > > 
> > >    fNameL->Resize(250, fNameL->GetDefaultHeight());
> > > 
> > > // Subframe Directory
> > >    fFrameDir = new TGGroupFrame(fFrameLT, "Directory",
> > > kHorizontalFrame);
> > >    fFrameLT->AddFrame(fFrameDir,
> > >              new TGLayoutHints(kLHintsTop | kLHintsLeft |
> > > kLHintsExpandX,5, 5, 5, 5));
> > > 
> > >    fDir = new TGTextEntry(fFrameDir, fBufDir = new TGTextBuffer(255),
> > > -1);
> > >    fDir->Connect("ReturnPressed()", "TNewDlog", this, "FPressOK()");
> > >    fDir->Connect("TabPressed()", "TNewDlog", this, "FChangeFocus()");
> > > //   fDir = new TGListBox(fFrameDir,-1);
> > >    fDir->Resize(400,20);
> > >    char tmp[255];
> > >    sprintf(tmp,"%s",gSystem->WorkingDirectory());
> > >    fDir->SetText(tmp);
> > > //   fDir->AddEntry(tmp,1);
> > >    fFrameDir->AddFrame(fDir, new
> > > TGLayoutHints(kLHintsLeft|kLHintsTop,2,2,2,2));
> > > 
> > >    fBrowseBtn = new TGTextButton(fFrameDir, "&Browse...", 1);
> > >    fBrowseBtn->Connect("Clicked()", "TNewDlog", this, "FBrowse()");
> > >    fFrameDir->AddFrame(fBrowseBtn, new TGLayoutHints(kLHintsRight |
> > > kLHintsTop));
> > > 
> > > // FrameLB for OK, Cancel
> > >    fFrameLB = new TGHorizontalFrame(fMain, 200, 20, kFixedWidth);
> > >    fMain->AddFrame(fFrameLB, new TGLayoutHints(kLHintsLeft |
> > > kLHintsBottom));
> > > 
> > >    fOkBtn = new TGTextButton(fFrameLB, "&OK", 1);
> > >    fOkBtn->Connect("Clicked()", "TNewDlog", this, "FPressOK()");
> > >    //fOkBtn->Resize(150,20); // does not work
> > >    fFrameLB->AddFrame(fOkBtn,
> > >              new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX,
> > >                                5, 5, 5, 5));
> > > 
> > >    fCancelBtn = new TGTextButton(fFrameLB, "&Cancel", 1);
> > >    fCancelBtn->Connect("Clicked()", "TNewDlog", this, "FCancel()");
> > >    fFrameLB->AddFrame(fCancelBtn,
> > >              new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX,
> > >                                5, 5, 5, 5));
> > > 
> > >    fFrameLB->Resize(150, fOkBtn->GetDefaultHeight());
> > > 
> > >    fMain->MapSubwindows();
> > >    fMain->Resize(fMain->GetDefaultSize());
> > >    fMain->SetWMPosition(140,120);
> > >    fMain->Move(140,120);
> > > //   fMain->Resize(400,220);
> > > 
> > >    fMain->SetWindowName("New Dialog");
> > > 
> > >    fMain->MapWindow();
> > > }//Constructor
> > > 
> > > //----------------------------------------------------------------------//
> > > 
> > > TNewDlog::~TNewDlog()
> > > {
> > >    delete fOkBtn; delete fCancelBtn; delete fFrameLB;
> > >    delete fBrowseBtn; delete fDir; delete fFrameDir;
> > >    delete fNameL; delete fNameF; delete fFrameInfo;
> > >    delete fFrameLT;
> > > 
> > >    delete fMain;
> > > }//Destructor
> > > 
> > > //----------------------------------------------------------------------//
> > > 
> > > void TNewDlog::FCloseWindow()
> > > {
> > >    delete this;
> > > }//FCloseWindow
> > > 
> > > //----------------------------------------------------------------------//
> > > 
> > > void TNewDlog::FBrowse()
> > > {
> > >    printf("Browse\n");
> > > 
> > >    TGFileInfo fi;
> > >    fi.fFileTypes = filetypes;
> > >    fi.fIniDir    = StrDup(fBufDir->GetString());
> > >    printf("fIniDir = %s\n", fi.fIniDir);
> > >    new TGFileDialog(gClient->GetRoot(), fMain, kFDOpen, &fi);
> > >    printf("Open file: %s (dir: %s)\n", fi.fFilename, fi.fIniDir);
> > >    fDir->SetText(fi.fIniDir);
> > > }//FBrowseProject
> > > 
> > > //----------------------------------------------------------------------//
> > > 
> > > void TNewDlog::FCancel()
> > > {
> > > // Clear entries
> > >    fBufF->Clear();
> > >    fBufL->Clear();
> > > 
> > >    printf("Cancel\n");
> > > }//FCancel
> > > 
> > > //----------------------------------------------------------------------//
> > > 
> > > void TNewDlog::FPressOK()
> > > {
> > >    cout << "First Name: " << fBufF->GetString() << endl;
> > >    cout << "Last Name: " << fBufL->GetString() << endl;
> > >    cout << "Directory: " << fBufDir->GetString() << endl;
> > > 
> > >    fMain->SendCloseMessage();
> > > }//FPressOK
> > > 
> > > //----------------------------------------------------------------------//
> > > 
> > > void TNewDlog::FChangeFocus()
> > > {
> > >    if (gTQSender == fNameF)
> > >       fNameL->SetFocus();
> > > 
> > >    if (gTQSender == fNameL)
> > >       fDir->SetFocus();
> > > 
> > >    if (gTQSender == fDir)
> > >       fNameF->SetFocus();
> > > }
> > > 
> > > //----------------------------------------------------------------------//
> > > 
> > > void guiex2()
> > > {
> > >    new TNewDlog(gClient->GetRoot(), 400, 220);
> > > }
> > > 
> > > //-------------------------END-------------------
> > > 
> 



This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:09 MET