I want to get a list of signals that a given TQClass supports, but GetListOfSignals and GetListOfClassSignals seems to return an empty list? I’m currently doing something like:
Should this not be returning a list of signal names which a TCanvas supports?
I have also tried CollectClassSignalLists, but to no avail.
Hi,
The GetListOfSignals() method returns the list of actually connected signals.
Here is a small example macro showing how to obtain the list of declared signals for a given class name (using the //*SIGNAL comment)
[code]#include “TList.h”
#include “TMethod.h”
#include “TClass.h”
//______________________________________________________________________________
TList *GetSignalsForClass(const char *classname = “TCanvas”)
{
// returns the list of signals for a given class
TMethod *method = 0;
const char *comment = 0;
TList *siglist = new TList();
siglist->Clear();
TList *methods_list = TClass::GetClass(classname)->GetListOfMethods();
TIter next_method(methods_list);
while ((method = (TMethod *)next_method())) {
comment = method->GetCommentString();
if (comment && strlen(comment) && strstr(comment,"*SIGNAL"))
siglist->Add(method);
}
return siglist;
}
[/code]
Cheers, Bertrand.
Aha! The comment string. I was wondering how this information found itself into the documentation.
Thanks
Here is a brief snippet in python for generating a list of all the signals in a class, in case anyone else wants to do the same.
[code]import ROOT
from pprint import pprint
def ListSignals(class_):
result = [m.GetPrototype()
for m in class_.GetListOfMethods()
if "SIGNAL" in m.GetCommentString()]
for baseclass in class_.GetListOfBases():
subclass = baseclass.GetClassPointer()
result.extend(ListSignals(subclass))
return result
if name == “main”:
c = ROOT.TClass.GetClass("TCanvas")
pprint(ListSignals(c))[/code]
Output:
['void TCanvas::Picked(TPad* selpad,TObject* selected,Int_t event)',
'void TCanvas::ProcessedEvent(Int_t event,Int_t x,Int_t y,TObject* selected)',
'void TCanvas::Selected(TVirtualPad* pad,TObject* obj,Int_t event)',
'void TCanvas::Cleared(TVirtualPad* pad)',
'void TCanvas::Closed()',
'void TPad::Closed()',
'void TPad::Modified(Bool_t flag=1)',
'void TPad::RangeChanged()',
'void TPad::RangeAxisChanged()',
'void TQObject::Destroyed()',
'void TQObject::ChangedBy(const char* method)',
'void TQObject::Message(const char* msg)']
Thanks! And for the record, here is the same (including base classes signals) in C++
[code]#include “Riostream.h”
#include “TList.h”
#include “TMethod.h”
#include “TClass.h”
//______________________________________________________________________________
TList *GetSignalsForClass(const char *classname = “TCanvas”)
{
// returns the list of signals for a given class
TMethod *method = 0;
const char *comment = 0;
TList *siglist = new TList();
siglist->Clear();
TList *methods_list = TClass::GetClass(classname)->GetListOfAllPublicMethods();
TIter next_method(methods_list);
while ((method = (TMethod *)next_method())) {
comment = method->GetCommentString();
if (comment && strlen(comment) && strstr(comment,"*SIGNAL"))
siglist->Add(method);
}
return siglist;
}
//______________________________________________________________________________
void ListSignals(const char *name = “TCanvas”)
{
// main function
TMethod *method = 0;
TIter snext(GetSignalsForClass(name));
while ((method = (TMethod *)snext())) {
cout << method->GetPrototype() << endl;
}
}
[/code]
Output:
root [0] .x ListSignals.C("TCanvas")
void TCanvas::Picked(TPad* selpad,TObject* selected,Int_t event)
void TCanvas::ProcessedEvent(Int_t event,Int_t x,Int_t y,TObject* selected)
void TCanvas::Selected(TVirtualPad* pad,TObject* obj,Int_t event)
void TCanvas::Cleared(TVirtualPad* pad)
void TCanvas::Closed()
void TPad::Modified(Bool_t flag=1)
void TPad::RangeChanged()
void TPad::RangeAxisChanged()
void TPad::RecordPave(const TObject* obj)
void TPad::RecordLatex(const TObject* obj)
void TPad::EventPave()
void TPad::StartEditing()
void TQObject::Destroyed()
void TQObject::ChangedBy(const char* method)
void TQObject::Message(const char* msg)
root [1]
Cheers, Bertrand.
Ah, did not know about GetListOfAllPublicMethods()
The python version can be shortened to this
def ListSignals(class_):
return [m.GetPrototype()
for m in class_.GetListOfAllPublicMethods()
if "*SIGNAL" in m.GetCommentString()]