File indexing completed on 2024-05-19 05:35:23
0001 ////////////////////////////////////////////////////////////////////////////// 0002 // oxygenwidgetexplorer.cpp 0003 // print widget's and parent's information on mouse click 0004 // ------------------- 0005 // 0006 // SPDX-FileCopyrightText: 2010 Hugo Pereira Da Costa <hugo.pereira@free.fr> 0007 // 0008 // SPDX-License-Identifier: MIT 0009 ////////////////////////////////////////////////////////////////////////////// 0010 0011 #include "oxygenwidgetexplorer.h" 0012 #include "oxygen.h" 0013 0014 #include <QApplication> 0015 #include <QMouseEvent> 0016 #include <QPainter> 0017 #include <QTextStream> 0018 0019 #include <iostream> 0020 0021 namespace Oxygen 0022 { 0023 //________________________________________________ 0024 WidgetExplorer::WidgetExplorer(QObject *parent) 0025 : QObject(parent) 0026 , _enabled(false) 0027 , _drawWidgetRects(false) 0028 { 0029 _eventTypes.insert(QEvent::Enter, QStringLiteral("Enter")); 0030 _eventTypes.insert(QEvent::Leave, QStringLiteral("Leave")); 0031 0032 _eventTypes.insert(QEvent::HoverMove, QStringLiteral("HoverMove")); 0033 _eventTypes.insert(QEvent::HoverEnter, QStringLiteral("HoverEnter")); 0034 _eventTypes.insert(QEvent::HoverLeave, QStringLiteral("HoverLeave")); 0035 0036 _eventTypes.insert(QEvent::MouseMove, QStringLiteral("MouseMove")); 0037 _eventTypes.insert(QEvent::MouseButtonPress, QStringLiteral("MouseButtonPress")); 0038 _eventTypes.insert(QEvent::MouseButtonRelease, QStringLiteral("MouseButtonRelease")); 0039 0040 _eventTypes.insert(QEvent::FocusIn, QStringLiteral("FocusIn")); 0041 _eventTypes.insert(QEvent::FocusOut, QStringLiteral("FocusOut")); 0042 0043 // _eventTypes.insert( QEvent::Paint, "Paint" ); 0044 } 0045 0046 //________________________________________________ 0047 void WidgetExplorer::setEnabled(bool value) 0048 { 0049 if (value == _enabled) 0050 return; 0051 _enabled = value; 0052 0053 qApp->removeEventFilter(this); 0054 if (_enabled) 0055 qApp->installEventFilter(this); 0056 } 0057 0058 //________________________________________________ 0059 bool WidgetExplorer::eventFilter(QObject *object, QEvent *event) 0060 { 0061 if (object->isWidgetType()) { 0062 QString type(_eventTypes[event->type()]); 0063 if (!type.isEmpty()) { 0064 std::cout << "Oxygen::WidgetExplorer::eventFilter - widget: " << object << " (" << object->metaObject()->className() << ")"; 0065 std::cout << " type: " << qPrintable(type) << std::endl; 0066 } 0067 } 0068 0069 switch (event->type()) { 0070 case QEvent::Paint: 0071 if (_drawWidgetRects) { 0072 QWidget *widget(qobject_cast<QWidget *>(object)); 0073 if (!widget) 0074 return false; 0075 0076 QPainter painter(widget); 0077 painter.setRenderHints(QPainter::Antialiasing); 0078 painter.setBrush(Qt::NoBrush); 0079 painter.setPen(Qt::red); 0080 painter.drawRect(widget->rect()); 0081 painter.end(); 0082 } 0083 break; 0084 0085 case QEvent::MouseButtonPress: { 0086 // cast event and check button 0087 QMouseEvent *mouseEvent(static_cast<QMouseEvent *>(event)); 0088 if (mouseEvent->button() != Qt::LeftButton) 0089 break; 0090 0091 // case widget and check (should not be necessary) 0092 QWidget *widget(qobject_cast<QWidget *>(object)); 0093 if (!widget) 0094 return false; 0095 0096 std::cout << "Oxygen::WidgetExplorer::eventFilter -" 0097 << " event: " << event << " type: " << qPrintable(eventType(event->type())) << " widget: " << qPrintable(widgetInformation(widget)) 0098 << std::endl; 0099 0100 // print parent information 0101 QWidget *parent(widget->parentWidget()); 0102 while (parent) { 0103 std::cout << " parent: " << qPrintable(widgetInformation(parent)) << std::endl; 0104 parent = parent->parentWidget(); 0105 } 0106 std::cout << "" << std::endl; 0107 0108 } break; 0109 0110 default: 0111 break; 0112 } 0113 0114 // always return false to go on with normal chain 0115 return false; 0116 } 0117 0118 //________________________________________________ 0119 QString WidgetExplorer::eventType(const QEvent::Type &type) const 0120 { 0121 switch (type) { 0122 case QEvent::MouseButtonPress: 0123 return QStringLiteral("MouseButtonPress"); 0124 case QEvent::MouseButtonRelease: 0125 return QStringLiteral("MouseButtonRelease"); 0126 case QEvent::MouseMove: 0127 return QStringLiteral("MouseMove"); 0128 default: 0129 return QStringLiteral("Unknown"); 0130 } 0131 } 0132 0133 //________________________________________________ 0134 QString WidgetExplorer::widgetInformation(const QWidget *widget) const 0135 { 0136 QRect r(widget->geometry()); 0137 const char *className(widget->metaObject()->className()); 0138 QString out; 0139 QTextStream(&out) << widget << " (" << className << ")" 0140 << " position: " << r.x() << "," << r.y() << " size: " << r.width() << "," << r.height() 0141 << " hover: " << widget->testAttribute(Qt::WA_Hover); 0142 return out; 0143 } 0144 }