myitem.h #ifndef MYITEM_H #define MYITEM_H #include #include class MyItem : public QTreeWidgetItem { }; class ObjectItem : public MyItem { public: ObjectItem () : obj (nullptr) { } private: QObject * obj; public: QObject * getObject () { return obj; } void setObject (QObject * p) { obj = p; } }; class MethodItem : public ObjectItem { public: MethodItem () { } private: QMetaMethod meth; public: QMetaMethod getMethod () { return meth; } void setMethod (QMetaMethod p) { meth = p; } }; #endif // MYITEM_H mywindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include #include #include "myitem.h" namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private slots: void on_treeWidget_itemActivated(QTreeWidgetItem *item, int column); private: Ui::MainWindow *ui; int line_count; void displayTree(QTreeWidgetItem *target, QObject *obj); void displayDetail(QTreeWidgetItem *target, QObject *obj); QTableWidgetItem * displayLine (QString name, QString value, QColor color = QColor () ); void displayProperty (const QObject * obj, QMetaProperty prop); void displayObject (QObject * obj); void displayMethod (QObject * obj, QMetaMethod meth); }; #endif // MAINWINDOW_H mywindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi (this); displayTree (ui->treeWidget->invisibleRootItem(), this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::displayTree (QTreeWidgetItem * target, QObject * obj) { auto node = new ObjectItem; const QMetaObject * type = obj->metaObject(); QString s = obj->objectName() + " : " + type->className(); node->setText (0, s); node->setObject (obj); node->setForeground(0, QColor ("blue")); target->addChild (node); displayDetail (node, obj); const QObjectList & list = obj->children(); for (QObject * t : list) displayTree (node, t); } void MainWindow::displayDetail (QTreeWidgetItem * target, QObject * obj) { const QMetaObject * type = obj->metaObject(); QTreeWidgetItem * branch = new QTreeWidgetItem (); branch->setText(0, "methods"); branch->setForeground(0, QColor ("lime")); target->addChild (branch); int cnt = type->methodCount(); for (int i = 0; i < cnt; i++) { QMetaMethod meth = type->method(i); MethodItem * item = new MethodItem; item->setObject (obj); item->setMethod (meth); item->setForeground(0, QColor ("lime")); item->setText(0, meth.name()); QString t = QString (meth.typeName()) + " " + meth.methodSignature(); item->setToolTip(0, t); branch->addChild (item); } } void MainWindow::on_treeWidget_itemActivated (QTreeWidgetItem *item, int column) { if ( MethodItem * meth_item = dynamic_cast (item) ) displayMethod (meth_item->getObject(), meth_item->getMethod()); else if ( ObjectItem * obj_item = dynamic_cast (item) ) displayObject (obj_item->getObject()); } void MainWindow::displayMethod (QObject * obj, QMetaMethod meth) { line_count = 0; ui->tableWidget->setColumnCount(2); ui->tableWidget->setRowCount(0); displayLine ("type name", meth.typeName (), QColor ("yellow")); displayLine ("object name", objectName (), QColor ("orange")); displayLine ("method name", meth.name (), QColor ("red")); QList names = meth.parameterNames(); QList types = meth.parameterTypes(); int n = meth.parameterCount(); for (int i = 0; i < n; i++) { QString s = names[i] + " : " + types[i]; displayLine (s, "", QColor ("green")); } } QTableWidgetItem * MainWindow::displayLine (QString name, QString value, QColor color) { int line = line_count; line_count ++; if (ui->tableWidget->rowCount() < line_count) ui->tableWidget->setRowCount (line_count); QTableWidgetItem * item = new QTableWidgetItem; item->setText (name); if (color.isValid ()) item->setForeground(color); ui->tableWidget->setItem (line, 0, item); item = new QTableWidgetItem; item->setText (value); if (color.isValid ()) item->setForeground(color); ui->tableWidget->setItem (line, 1, item); return item; } void MainWindow::displayProperty (const QObject * obj, QMetaProperty prop) { QString name = prop.name (); QVariant value = prop.read (obj); QTableWidgetItem * item = displayLine (name, value.toString()); QVariant::Type t = value.type(); if (t == QVariant::Bool) { bool b = value.toBool (); item->setData (Qt::CheckStateRole, b ? Qt::Checked : Qt::Unchecked); } if (t == QVariant::Color) { QColor c = value.value (); item->setData (Qt::DecorationRole, c); } if (t == QVariant::Palette) { QPalette p = value.value (); QColor c = p.background().color(); item->setData (Qt::DecorationRole, c); } if (t == QVariant::Icon) { QIcon i = value.value (); item->setData (Qt::DecorationRole, i); } if (t == QVariant::Image) { QImage i = value.value (); item->setData (Qt::DecorationRole, i); } // if (t == QVariant::Color) } void MainWindow::displayObject (QObject * obj) { line_count = 0; ui->tableWidget->setColumnCount(2); ui->tableWidget->setRowCount(0); QStringList list; list << "Name" << "Value"; ui->tableWidget->setHorizontalHeaderLabels (list); const QMetaObject * type = obj->metaObject (); displayLine("className", type->className(), QColor ("blue")); int cnt = type->propertyCount(); for (int inx = 0; inx < cnt; inx++) { // #include QMetaProperty prop = type->property (inx); displayProperty (obj, prop); } } int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }