[ROOT] Error in <TQObject::CheckConnectArgs> slot ... does not exist

From: Colley, Tony (Tony.Colley@itt.com)
Date: Wed Feb 20 2002 - 17:13:46 MET


I have a stand-alone application linked with the ROOT libraries. I create a
canvas and draw a histogram or graph on it. I want to know when the user
closes the canvas so that I can clean up (and not try to delete the canvas
later, which causes ROOT to "**break** segmentation violation").

So I searched the ROOT web site. I read the article on "How to Use the
Signal/Slot Communication Mechanism"... I read the email thread with the
subject "attaching action to window close". I tried the solution proposed by
Fons in his 30 Oct 2000 email in that thread. And I get the error indicated
in the above subject line when I call Connect.

I searched the ROOT web site more. I found several emails over the last few
years asking similar questions, but the thread I just mentioned is the only
time anyone responded publicly.

So now I ask for help.

Excerpts of code:

-- From DvatCanvas.h file -----

#include "TCanvas.h"
#include "RQ_OBJECT.h"

class DvatCanvas
{
   RQ_OBJECT("DvatCanvas");
   
public:
   [edited]

   // FUNCTION TO MONITOR CLOSING OF CANVAS
   void monitorClose();

   [edited]
private:
   TCanvas *m_canvas;

   [edited]
};


-- From DvatCanvas.cpp file -----

static long canvas_number = 0;

// PRIVATE FUNCTION TO CREATE CANVAS
void DvatCanvas::createCanvas( int width, int height, int xpos, int ypos )
{
   ostringstream cname;

   ++canvas_number;
   cname << "canvas" << canvas_number;

   m_canvas = dcs_create_canvas( cname.str(), width, height, xpos, ypos );

   TRootCanvas *rc = (TRootCanvas*)m_canvas->GetCanvasImp();
   rc->Connect("CloseWindow()", 0, 0, "monitorClose()");

   return;
}

// FUNCTION TO MONITOR CLOSING OF CANVAS
void DvatCanvas::monitorClose()
{
   cout << "DvatCanvas::monitorClose" << endl;
}

-------- END OF CODE EXCERPTS --------------

Note that the function dcs_create_canvas requests the "GUI Thread" to create
a TCanvas and return it to the "current thread". As I explained in an
earlier email thread, this is how I got the ROOT libraries to work in a
multi-threaded application.

Also note that the DvatCanvas::createCanvas() function is called by all of
DvatCanvas's constructors.

Anyway, everything works fine... the canvas is created, stuff is drawn on
it, the user can interact normally with the canvas and its objects... except
when I call Connect() I get the message:

  Error in <TQObject::CheckConnectArgs> slot monitorClose does not exist

And, of course, monitorClose() is not called when the user closes the
canvas.

I tried specifying "DvatCanvas::monitorClose()" in the Connect call, but
that didn't make any difference.

Help!

Tony Colley
ITT Industries A/CD
Fort Wayne, IN  USA
Tony.Colley@itt.com

************************************ 
If this email is not intended for you, or you are not responsible for the
delivery of this message to the addressee, please note that this message may
contain ITT Privileged/Proprietary Information.  In such a case, you may not
copy or deliver this message to anyone.  You should destroy this message and
kindly notify the sender by reply email.  Information contained in this
message that does not relate to the business of ITT is neither endorsed by
nor attributable to ITT. 
************************************ 



This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:50:42 MET