Obtaining a list of signals

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 :slight_smile:

You’re most welcome! :slight_smile:

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 :wink:

def ListSignals(class_): return [m.GetPrototype() for m in class_.GetListOfAllPublicMethods() if "*SIGNAL" in m.GetCommentString()]