QT自定义结构体struct—— 基于QVariant 类 用于信号与槽

本文介绍了如何在QT中使用自定义结构体与QVariant结合,以便在信号和槽之间传递数据。首先需要在头文件中包含QVariant,然后声明信号和槽函数。接着在子文件中定义槽函数,同时在槽函数同名的.h文件中定义结构体。信号内部将结构体值转换为QVariant,最后在槽函数中解析接收到的QVariant以获取结构体数据。
摘要由CSDN通过智能技术生成

1.头文件加#include<QVariant>

#include<QVariant>

2.主.h 文件 声明信号

signals:
    void addData(QVariant);//QVariant作参数,传递结构体数据

 3 子.h 文件 声明 槽函数

addData_slot(QVariant)

4连接信号与槽 

connect(this,SIGNAL(addData(QVariant)),newChart,SLOT(addData_slot(QVariant)));

5.定义结构体(在要解析的槽函数同名 .h 里面)

typedef struct DATA //定义作图的结构体
{
    qreal timestamp;
    qreal open;
    qreal high ;
    qreal low ;
    qreal close ;
} Data;

6.信号里面定义结构体赋值给 QVariant

Data dataStruct;//定义结构体

dataStruct.timestamp = strList.at(0).toDouble();
dataStruct.open = strList.at(1).toDouble();
dataStruct.high = strList.at(2).toDouble();
dataStruct.low = strList.at(3).toDouble();
dataStruct.close = strList.at(4).toDouble();

//! 结构体 装进QVariant 
QVariant variant;
variant.setValue(dataStruct);

emit(addData(varia
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")); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值