Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
QPaintWidget.cpp
Go to the documentation of this file.
1// Author: Sergey Linev, GSI 29/06/2026
2
3/*************************************************************************
4 * Copyright (C) 1995-2026, Rene Brun and Fons Rademakers. *
5 * All rights reserved. *
6 * *
7 * For the licensing terms see $ROOTSYS/LICENSE. *
8 * For the list of contributors see $ROOTSYS/README/CREDITS. *
9 *************************************************************************/
10
11#include "QPaintWidget.h"
12
13#include <iostream>
14
15#include "TCanvas.h"
16#include "TROOT.h"
17
18#include <QtCore/QTimer>
19#include <QDragEnterEvent>
20#include <QDropEvent>
21#include <QMouseEvent>
22#include <QWheelEvent>
23#include <QHelpEvent>
24#include <QCloseEvent>
25
26#include <QToolTip>
27#include <QFont>
28#include <QRect>
29#include <QPainter>
30
31/** \class QPaintWidget
32 \ingroup qt6canvas
33
34Represent area where actual canvas painting is performed
35
36Qt defines `paintEvent` virtual method where all painting should be done.
37At this moment QPainter object is created which then used in \ref TVirtualPadPainter API.
38*/
39
40
41////////////////////////////////////////////////////////////////////////////////
42/// Constructor
43
45{
46 setObjectName("QPaintWidget");
47
48 setSizeIncrement(QSize(100, 100));
49
51 setMouseTracking(true);
52
53 setFocusPolicy(Qt::TabFocus);
54 setCursor(Qt::CrossCursor);
55
56 setAcceptDrops(true);
57
58 fCanvas = nullptr;
59
60 fQtScalingfactor = (double) metric(QPaintDevice::PdmDevicePixelRatioScaled)/65536.;
61}
62
63////////////////////////////////////////////////////////////////////////////////
64/// Destructor
65
69
70////////////////////////////////////////////////////////////////////////////////
71/// Convert mouse event position to canvas coordinates
72
74{
75 int scaledX = scaledPosition(e->position().x());
76 int scaledY = scaledPosition(e->position().y());
77 return QPoint(scaledX, scaledY);
78}
79
80////////////////////////////////////////////////////////////////////////////////
81/// Generic event handler
82///
83/// Used to handle tooltip event - if configured
84
86{
87 if (fShowToolTip && (event->type() == QEvent::ToolTip)) {
88 auto *helpEvent = static_cast<QHelpEvent *>(event);
89
90 TObject *selected = fCanvas->GetSelected();
91 Int_t px = fCanvas->GetEventX();
92 Int_t py = fCanvas->GetEventY();
93 QString customText;
94 if (selected) {
95 customText = QString("%1::%2<br>%3<br>%4, %5<br>%6")
96 .arg(selected->ClassName()).arg(selected->GetName())
97 .arg(selected->GetTitle())
98 .arg(px).arg(py)
99 .arg(selected->GetObjectInfo(px, py));
100 } else {
101 customText = QString("No selected object<br>%1, %2")
102 .arg(px).arg(py);
103 }
104
105 // 4. Force screen coordinates to bypass standard widget offset logic
106 QToolTip::showText(helpEvent->globalPos(), customText, this);
107
108 return true; // Event handled successfully
109 }
110
111 return QWidget::event(event);
112}
113
114////////////////////////////////////////////////////////////////////////////////
115/// Resize event handler
116
118{
119 if (fCanvas) {
120 fCanvas->Resize();
121 fCanvas->Modified();
122 }
123}
124
125////////////////////////////////////////////////////////////////////////////////
126/// Paint event handler
127///
128/// Only inside this method painting on QWidget is allowed
129/// For this temporary QPainter object is created and assigned to fPainter
130/// Any attempt to paint outside this method will be blocked - while fPainter will be 0
131
132
134{
135 try {
136 QPainter painter(this);
137
138 fPainter = &painter;
139
140 fCanvas->Paint();
141
142 fPainter = nullptr;
143
144 } catch(...) {
145 fPainter = nullptr;
146 }
147}
148
149////////////////////////////////////////////////////////////////////////////////
150/// Mouse press event handler
151
153{
155
156 switch(e->button()) {
157 case Qt::LeftButton:
159 // emit PadClicked(pad, scaled.x(), scaled.y());
160 break;
161 case Qt::RightButton : {
163 break;
164 }
165 case Qt::MiddleButton :
167 // emit SelectedPadChanged(pad);
168 break;
169 case Qt::NoButton :
170 break;
171 default:
172 break;
173 }
174 e->accept();
175}
176
177
178////////////////////////////////////////////////////////////////////////////////
179/// Mouse move event handler
180
182{
183 e->accept();
184
185 if (fCanvas) {
187
188 if (e->buttons() & Qt::LeftButton)
190 else
192 }
193
194 if (fShowEventStatus) {
195 TObject *selected = fCanvas->GetSelected();
196 Int_t px = fCanvas->GetEventX();
197 Int_t py = fCanvas->GetEventY();
198 QString buffer = "";
199 if (selected) {
200 buffer = selected->GetName();
201 buffer += " ";
202 buffer += selected->GetObjectInfo(px, py);
203 } else {
204 buffer = "No selected object x = ";
205 buffer += QString::number(px);
206 buffer += " y = ";
207 buffer += QString::number(py);
208 }
209
210 emit CanvasStatusEvent(buffer);
211 }
212}
213
214////////////////////////////////////////////////////////////////////////////////
215/// Mouse release event handler
216
218{
220
221 switch(event->button()) {
222 case Qt::LeftButton :
224 break;
225 case Qt::RightButton :
227 break;
228 case Qt::MiddleButton :
230 break;
231 case Qt::NoButton :
232 break;
233 default:
234 break;
235 }
236
237 event->accept();
238}
239
240////////////////////////////////////////////////////////////////////////////////
241/// Mouse double click event handler
242
244{
246
247 switch(event->button()) {
248 case Qt::LeftButton : {
249 if (!fMaskDoubleClick)
251 break;
252 }
253 case Qt::RightButton :
255 break;
256 case Qt::MiddleButton :
258 break;
259 case Qt::NoButton :
260 break;
261 default:
262 break;
263 }
264
265 event->accept();
266}
267
268////////////////////////////////////////////////////////////////////////////////
269/// Wheel event handler
270
272{
273 QPoint delta = event->pixelDelta();
274 if (delta.isNull())
275 delta = event->angleDelta() / 8;
276 bool positive = delta.x() > 0 || delta.y() > 0;
277
278 int sx = scaledPosition(event->position().x());
279 int sy = scaledPosition(event->position().y());
280
282
283 event->accept();
284}
285
286////////////////////////////////////////////////////////////////////////////////
287/// Enter event handler
288
290{
291 QWidget::enterEvent(event);
292
294}
295
296////////////////////////////////////////////////////////////////////////////////
297/// Leave event handler
298
300{
301 QWidget::leaveEvent(event);
302
304}
@ kMouseMotion
Definition Buttons.h:23
@ kWheelUp
Definition Buttons.h:18
@ kButton3Up
Definition Buttons.h:19
@ kButton3Down
Definition Buttons.h:17
@ kButton2Down
Definition Buttons.h:17
@ kButton2Double
Definition Buttons.h:24
@ kButton1Double
Definition Buttons.h:24
@ kButton3Double
Definition Buttons.h:24
@ kButton1Motion
Definition Buttons.h:20
@ kButton1Up
Definition Buttons.h:19
@ kWheelDown
Definition Buttons.h:18
@ kButton2Up
Definition Buttons.h:19
@ kMouseLeave
Definition Buttons.h:23
@ kButton1Down
Definition Buttons.h:17
@ kMouseEnter
Definition Buttons.h:23
#define e(i)
Definition RSha256.hxx:103
cudaEvent_t event
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
QPaintWidget(QWidget *parent=nullptr)
Constructor.
void wheelEvent(QWheelEvent *event) override
Wheel event handler.
double scaledPosition(int p)
double fQtScalingfactor
void mouseReleaseEvent(QMouseEvent *event) override
Mouse release event handler.
void resizeEvent(QResizeEvent *event) override
Resize event handler.
QPainter * fPainter
temporary painter created inside paintEvent handler
void enterEvent(QEnterEvent *event) override
Enter event handler.
QPoint scaledMousePoint(QMouseEvent *event)
Convert mouse event position to canvas coordinates.
void mouseDoubleClickEvent(QMouseEvent *event) override
Mouse double click event handler.
void leaveEvent(QEvent *event) override
Leave event handler.
void paintEvent(QPaintEvent *event) override
Paint event handler.
void CanvasStatusEvent(const QString &msg)
void mousePressEvent(QMouseEvent *event) override
Mouse press event handler.
bool event(QEvent *event) override
Generic event handler.
bool fShowEventStatus
bool fMaskDoubleClick
TCanvas * fCanvas
canvas shown in the widget
void mouseMoveEvent(QMouseEvent *event) override
Mouse move event handler.
virtual ~QPaintWidget()
Destructor.
Int_t GetEventY() const override
Definition TCanvas.h:141
virtual void Resize(Option_t *option="")
Recompute canvas parameters following a X11 Resize.
Definition TCanvas.cxx:1674
virtual void HandleInput(EEventType button, Int_t x, Int_t y)
Handle Input Events.
Definition TCanvas.cxx:1241
TObject * GetSelected() const override
Definition TCanvas.h:145
Int_t GetEventX() const override
Definition TCanvas.h:140
void Paint(Option_t *option="") override
Paint canvas.
Definition TCanvas.cxx:1549
Mother of all ROOT objects.
Definition TObject.h:42
void Modified(Bool_t flag=true) override
Mark pad modified Will be repainted when TCanvas::Update() will be called next time.
Definition TPad.cxx:7356