BibleTime
debugwindow.cpp
Go to the documentation of this file.
1/*********
2*
3* In the name of the Father, and of the Son, and of the Holy Spirit.
4*
5* This file is part of BibleTime's source code, https://bibletime.info/
6*
7* Copyright 1999-2026 by the BibleTime developers.
8* The BibleTime source code is licensed under the GNU General Public License
9* version 2.0.
10*
11**********/
12
13#include "debugwindow.h"
14
15#include <QApplication>
16#include <QQuickWidget>
17#include <QQuickItem>
18#include <utility>
19
20
21namespace {
22
23QString classHierarchy(QObject const * const object) {
24 auto const * metaObject = object->metaObject();
25 QString result;
26 do {
27 if (!result.isEmpty())
28 result += QStringLiteral(": ");
29 result += metaObject->className();
30 metaObject = metaObject->superClass();
31 } while (metaObject);
32 return result;
33}
34
35void writeObjectHierarchy(QString & objectHierarchy,
36 QObject const * object,
37 QString const & firstLine,
38 QString const & childLine)
39{
40 do {
41 if (objectHierarchy.isEmpty()) {
42 objectHierarchy.append(firstLine.arg(classHierarchy(object)));
43 } else {
44 objectHierarchy.append(QStringLiteral("<br/>"))
45 .append(childLine.arg(classHierarchy(object)));
46 }
47 if (auto const quickItem = qobject_cast<QQuickItem const *>(object)) {
48 object = quickItem->parentItem();
49 } else {
50 object = object->parent();
51 }
52 } while (object);
53}
54
55} // anonymous namespace
56
57
59 : QTextEdit(nullptr)
60 , m_updateTimerId(startTimer(100))
61{
62 setWindowFlags(Qt::Dialog);
63 setAttribute(Qt::WA_DeleteOnClose);
64 setReadOnly(true);
66 show();
67}
68
70{ setWindowTitle(tr("What's this widget?")); }
71
72void DebugWindow::timerEvent(QTimerEvent * const event) {
73 if (event->timerId() == m_updateTimerId) {
74 auto const cursorPosition = QCursor::pos();
75 if (QObject const * w = QApplication::widgetAt(cursorPosition)) {
76 auto const childLine = tr("<b>child of:</b> %1");
77 QString objectHierarchy;
78 auto const * quickWidget = qobject_cast<QQuickWidget const *>(w);
79 if (quickWidget) {
80 auto const * item =
81 quickItemInFocus(quickWidget, cursorPosition);
82 writeObjectHierarchy(objectHierarchy,
83 item,
84 tr("<b>This Quick item is:</b> %1"),
85 childLine);
86 }
87 writeObjectHierarchy(objectHierarchy,
88 w,
89 tr("<b>This widget is:</b> %1"),
90 childLine);
91 setHtml(objectHierarchy);
92 } else {
93 setText(tr("No widget"));
94 }
95 } else {
96 QTextEdit::timerEvent(event);
97 }
98}
99
100QQuickItem const *
102 QPointF cursorPosition)
103{
104 auto const * item = quickWidget->rootObject();
105 auto quickPosition = item->mapFromGlobal(std::move(cursorPosition));
106 for (;;) {
107 if (auto const * const child =
108 item->childAt(quickPosition.x(), quickPosition.y()))
109 {
110 quickPosition = item->mapToItem(child, quickPosition);
111 item = child;
112 } else {
113 return item;
114 }
115 }
116}
void timerEvent(QTimerEvent *const event) override
int const m_updateTimerId
Definition debugwindow.h:40
static QQuickItem const * quickItemInFocus(QQuickWidget const *quickWidget, QPointF cursorPosition)
void retranslateUi()
void writeObjectHierarchy(QString &objectHierarchy, QObject const *object, QString const &firstLine, QString const &childLine)
QString classHierarchy(QObject const *const object)