0. 测试效果
1. 基本内容
主要是简单的实现将属性内容显示到界面中。主要是通过获取类中属性的类型和值,根据类型添加控件到QWidget中,并通过QFormLayout对控件进行布局。
2. 代码实现
- MyClass.h
#pragma once
#include <QObject>
class MyClass : public QObject
{
Q_OBJECT
Q_PROPERTY(int num MEMBER m_num)
Q_PROPERTY(QString name MEMBER m_name)
Q_PROPERTY(bool filter MEMBER m_filter)
Q_PROPERTY(Priority priority READ priority WRITE setPriority NOTIFY priorityChanged)
public:
MyClass(QObject* parent = nullptr){};
enum Priority { High, Low, VeryHigh, VeryLow };
Q_ENUM(Priority)
void setPriority(Priority priority)
{
m_priority = priority;
emit priorityChanged(priority);
}
Priority priority() const { return m_priority; }
signals:
void priorityChanged(Priority);
private:
int m_num = 10;
QString m_name = "name";
bool m_filter = true;
Priority m_priority;
};
- MainWindow.cpp
#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QMetaObject>
#include <QMetaProperty>
#include <QFormLayout>
#include <QComboBox>
#include <QDebug>
#include <QLabel>
#include <QLineEdit>
#include <QCheckBox>
MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->widget->setWindowTitle("Property");
QFormLayout* layout = new QFormLayout();
layout->setRowWrapPolicy(QFormLayout::DontWrapRows);
MyClass* myClass = new MyClass;
const QMetaObject* metaObj = myClass->metaObject();
const int propCount = metaObj->propertyCount();
for (int i = 0; i < propCount; ++i) {
const QMetaProperty prop = metaObj->property(i);
if (prop.isEnumType()) {
QComboBox* comBox = new QComboBox(this);
const int keyCount = prop.enumerator().keyCount();
for (int j = 0; j < keyCount; ++j) {
const char* key = prop.enumerator().key(j);
comBox->addItem(QString::fromLatin1(key));
}
layout->addRow(prop.enumerator().enumName(), comBox);
continue;
}
if (prop.type() == QVariant::Type::Bool) {
QCheckBox* value = new QCheckBox(ui->widget);
const char* propName = prop.name();
value->setText(myClass->property(propName).toString());
layout->addRow(QString::fromLatin1(propName), value);
continue;
}
QLineEdit* value = new QLineEdit(this);
const char* propName = prop.name();
value->setText(myClass->property(propName).toString());
layout->addRow(QString::fromLatin1(propName), value);
}
layout->setSpacing(10);
ui->widget->setLayout(layout);
ui->widget->show();
}
MainWindow::~MainWindow() { delete ui; }