I have looked online and in this forum. I have inherited an MFC application that embeds Root (version 5.34/36) to use the TCanvas and am researching the viability of moving from MFC to Qt5 (which is what my company currently uses). The first step of course is to make sure that Qt5 plays well with Root. So I have created a Qt5 project and instantiated a TApplication. Now I’m trying to create a window that embeds a TCanvas. So I have done the following:
void QtTester::OpenCanvas()
{
QRect rect = geometry();
int width = rect.width();
int height = rect.height();
int wid = gVirtualX->AddWindow((ULong_t)winId(), width, height);
m_pTCanvas = new TCanvas("Root canvas", width, height, wid);
int i=0;
}
But when I call this function I always get a zero as the value for the wid variable. The class owning the function is a QWidget window. I cannot find any reference to why I would be getting a return value of 0 from the AddWindow() call. Just for fun I added another function to paint a canvas (code taken from one of the example .C files, first tested in the root interactive interpreter), and it compiled fine, and the widget opened as a new window, but no data was painted as content. Which I assume means that I am correct in saying that 0 isn’t a valid return value for AddWindow(). The documentation says nothing about this.
Any help would be seriously appreciated.
ROOT Version: Not Provided Platform: Not Provided Compiler: Not Provided
Last time I tried (on Windows) with Qt 5.10, this was working just fine:
//______________________________________________________________________________
QRootCanvas::QRootCanvas(QWidget *parent) : QWidget(parent, 0), fCanvas(0)
{
// QRootCanvas constructor.
// set options needed to properly update the canvas when resizing the widget
// and to properly handle context menus and mouse move events
setAttribute(Qt::WA_PaintOnScreen, false);
setAttribute(Qt::WA_OpaquePaintEvent, true);
setAttribute(Qt::WA_NativeWindow, true);
setUpdatesEnabled(kFALSE);
setMouseTracking(kTRUE);
setMinimumSize(300, 200);
// register the QWidget in TVirtualX, giving its native window id
int wid = gVirtualX->AddWindow((ULong_t)winId(), width(), height());
// create the ROOT TCanvas, giving as argument the QWidget registered id
fCanvas = new TCanvas("Root Canvas", width(), height(), wid);
TQObject::Connect("TGPopupMenu", "PoppedDown()", "TCanvas", fCanvas, "Update()");
}
Thanks. I had seen reference to QRootCanvas but when I went looking for it in files in my include folder I didn’t find anything. I have both a Windows and a Linux system using with Root 5.34/36. I searched the full Root folder for QRootCanvas in the Windows Explorer with “search in files” set and didn’t find it. I then grepped the whole Root folder on the Linux box for the same and didn’t find it. Is there a way to get this functionality back if somehow it was removed?
Yeah, what does one do going forward? Are there ways to hook in to Root from Qt even though the support is not going to be there in the library? If not I guess I’ll have to look into another way of doing charting for the future. For now though I do need to figure this one out. Thanks for the reply.
The problem comes from Qt on MacOS. But it should still work on Linux and Windows. And we don’t have the manpower to support Qt on all platforms… Stay tuned