QVariant如何存储自定义结构体

1. QVariant介绍

QVariant是一个十分强大的类,它在Qt中被用来存储兼容类型、对象以及结构体。在这里我们假设要将一些复杂的结构体数据转换为QVariant

2.存储自定义的结构体

假设你已经定义了一个名为MyStruct的类,它拥有以下属性:

class MyStruct
{
public:
    QString name;
    int age;
    QList<QDateTime> eventTimes;

    // 其余代码...
};

将该类注册为qt的元对象系统中

Q_DECLARE_METATYPE(MyStruct)

现在需要将该结构体实例转换为QVariant,可以使用QVariant::fromValue()方法进行,如下所示:

MyStruct myStructObject; // 实例化一个MyStruct对象,并进行赋值操作

// 将这个实例包装到一个 QVariant 对象里面。
QVariant myVariant = QVariant::fromValue(myStructObject);

通过这段代码,QVariant对象myVariant 中会包含我们刚才创建的结构体对象myStructObject 的值,当我们再需要访问MyStruct信息时,可以通过调用QVariant的value()函数轻松地将其还原成原始的数据类型:

MyStruct retrievedData = myVariant.value<MyStruct>();

3. QVariantList

如何将一个列表数据存储到QVariant对象,这就需要用到QVariantList
加入定义了一个结构体

class CustomStruct
{
public:
    QString name;
    int age;
    QList<QDateTime> eventTimes;

    // 其余代码...
};

Q_DECLARE_METATYPE(CustomStruct*)
// 1. 要包装 QList<CustomStruct*>  customStructList指针,请首先转换为 QVariantList 类型。
QVariantList varList;
foreach (customStruct* elem, customStructList) {
    varList.append(QVariant::fromValue<customStruct*>(elem));
}

// 2. 然后将 QVariantList 存储为 QVariant 类型以便传递给其它函数。
QVariant variant;
variant.setValue(varList);


// 3. 如果需要还原 QList<CustomStruct*> 对象,则可以通过以下方式进行:

QVariantList varList = variant.value<QVariantList>();
QList<CustomStruct*> customStructList;
foreach (const QVariant& var , varList) {
        CustomStruct* detailInfo = var.value<CustomStruct*>();
        if (detailInfo) {
                customStructList.push_back(detailInfo);
        }
    }

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中,可以通过继承自QWidget或QAbstractItemDelegate,实现自定义结构体控件。 以下是一些基本的步骤: 1. 定义一个结构体用于存储需要显示的数据。 ```c++ struct MyStruct { QString name; int age; }; ``` 2. 创建一个继承自QWidget或QAbstractItemDelegate的类,并将结构体作为其成员变量。 ```c++ class MyStructWidget : public QWidget { Q_OBJECT public: MyStructWidget(QWidget *parent = nullptr); ~MyStructWidget(); void setData(const MyStruct &data); MyStruct getData() const; private: QLabel *nameLabel; QLabel *ageLabel; MyStruct m_data; }; ``` 或者: ```c++ class MyStructDelegate : public QAbstractItemDelegate { public: MyStructDelegate(QObject *parent = nullptr); QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override; void setEditorData(QWidget *editor, const QModelIndex &index) const override; void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override; void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override; void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; }; ``` 3. 在自定义控件类的构造函数中,创建控件并设置布局。 ```c++ MyStructWidget::MyStructWidget(QWidget *parent) : QWidget(parent) { nameLabel = new QLabel(this); ageLabel = new QLabel(this); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(nameLabel); layout->addWidget(ageLabel); setLayout(layout); } ``` 4. 实现setData和getData函数,用于设置和获取数据。 ```c++ void MyStructWidget::setData(const MyStruct &data) { m_data = data; nameLabel->setText(data.name); ageLabel->setText(QString::number(data.age)); } MyStruct MyStructWidget::getData() const { return m_data; } ``` 或者: ```c++ QWidget *MyStructDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { MyStructWidget *editor = new MyStructWidget(parent); return editor; } void MyStructDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { MyStruct data = index.model()->data(index, Qt::EditRole).value<MyStruct>(); static_cast<MyStructWidget*>(editor)->setData(data); } void MyStructDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { MyStruct data = static_cast<MyStructWidget*>(editor)->getData(); model->setData(index, QVariant::fromValue(data), Qt::EditRole); } void MyStructDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const { editor->setGeometry(option.rect); } void MyStructDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { MyStruct data = index.model()->data(index, Qt::DisplayRole).value<MyStruct>(); QString text = data.name + " " + QString::number(data.age); painter->drawText(option.rect, text); } ``` 5. 在使用自定义控件的地方,设置模型数据或委托。 ```c++ // 使用QWidget控件 MyStructWidget *widget = new MyStructWidget(this); MyStruct data = { "Tom", 18 }; widget->setData(data); // 使用QAbstractItemDelegate QStandardItemModel *model = new QStandardItemModel(this); model->setItemDelegate(new MyStructDelegate(this)); model->setItem(0, new QStandardItem("Tom 18")); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值