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);
}
}
}