treeitem.h #ifndef TREEITEM_H #define TREEITEM_H #include class TreeItem : public QTreeWidgetItem { public: QObject * obj; TreeItem () : obj (nullptr) { } }; #endif // TREEITEM_H mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void on_pushButton_clicked(); void on_treeWidget_itemDoubleClicked(QTreeWidgetItem *item, int column); private: Ui::MainWindow *ui; // #include void showBranch (QTreeWidgetItem * target, QObject * obj); QTableWidgetItem * addLine (QString name, QString value); }; #endif // MAINWINDOW_H mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_clicked() { setWindowIcon(QIcon::fromTheme("weather-clear")); QObject * p = ui->pushButton; while (p->parent() != nullptr) p = p->parent (); showBranch (ui->treeWidget->invisibleRootItem(), p); ui->treeWidget->expandAll (); } #include "treeitem.h" void MainWindow::showBranch (QTreeWidgetItem *target, QObject *obj) { TreeItem * branch = new TreeItem (); target->addChild (branch); const QMetaObject * cls = obj->metaObject(); branch->setText (0, obj->objectName() + " : " + cls->className ()); branch->obj = obj; for ( QObject * t : obj->children() ) showBranch (branch, t); } QTableWidgetItem * MainWindow::addLine(QString name, QString value) { int inx = ui->tableWidget->rowCount (); ui->tableWidget->setRowCount (inx +1); QTableWidgetItem * cell = new QTableWidgetItem (); cell ->setText (name); ui->tableWidget->setItem(inx, 0, cell); cell = new QTableWidgetItem (); cell ->setText (value); ui->tableWidget->setItem(inx, 1, cell); return cell; } void MainWindow::on_treeWidget_itemDoubleClicked(QTreeWidgetItem *item, int column) { TreeItem * node = dynamic_cast < TreeItem * > (item); if (node != nullptr) { ui->tableWidget->clear (); ui->tableWidget->setColumnCount(2); ui->tableWidget->setRowCount(0); QObject * obj = node->obj; addLine ("object name", obj->objectName()); const QMetaObject * cls = obj->metaObject(); addLine ("class name", cls->className()); int cnt = cls->propertyCount(); for (int i = 0; i < cnt; i++) { QMetaProperty prop = cls->property (i); QVariant v = prop.read (obj); QTableWidgetItem * cell = addLine (prop.name(), v.toString()); if (v.type() == QVariant::Icon) cell->setData (Qt::DecorationRole, v); } } }