Qt系列文章目录

文章目录

  • Qt系列文章目录
  • 前言
  • 一、Q_DECLARE_METATYPE是什么?
    • 示例代码
  • 二、编译错误
  • 三、问题解决
  • 四、源码下载
  • 五、运行效果

前言

一、Q_DECLARE_METATYPE是什么?

官网解释
只提供公共默认构造函数、公共复制构造函数和公共析构函数,该宏就会使QMetaType知道类型类型类型。需要将类型类型类型用作QVariant中的自定义类型。

此宏要求类型在使用时是完全定义的类型。对于指针类型,还需要完全定义指向类型。与Q_DECLARE_OPAQUE_POINTER()结合使用,注册指向已声明类型的指针。
理想情况下,这个宏应该放在类或结构的声明下面。如果不可能,可以将其放入私有头文件中,每次在QVariant中使用该类型时都必须包含该头文件。
添加Q_DECLARE_METATYPE()使所有基于模板的函数(包括QVariant)都知道该类型。请注意,如果您打算在排队信号和插槽连接或QObject的属性系统中使用该类型,则还必须调用qRegisterMetaType(),因为名称在运行时解析。

此示例显示了Q_DECLARE_METATYPE()的典型用例:

struct MyStruct
{int i;...
};Q_DECLARE_METATYPE(MyStruct)

在实际代码中,自己手动添加构造函数、拷贝构造函数、析构函数也是可以的例如:
头文件

#ifndef USER_H
#define USER_H#include<QObjectUserData>struct UserTest : public QObjectUserData
{public:UserTest();~UserTest();UserTest(const UserTest& other);public:QString m_imgPath;int m_itemType;
};Q_DECLARE_METATYPE(UserTest)#endif // USER_H

实现文件

#include "User.h"UserTest::UserTest()
{}UserTest::~UserTest()
{}UserTest::UserTest(const UserTest& other)
{m_imgPath = other.m_imgPath;m_itemType = other.m_itemType;
}

示例代码

头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QTreeWidget>
#include <QGridLayout>
#include <User.h>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();QTreeWidget *m_tree;QTreeWidgetItem *m_treeItem;UserTest* m_data;UserTest* m_data1;QWidget* m_widget;QGridLayout* m_layout;void initUi();Q_SIGNALS:void clickSendTreeItemData(QTreeWidgetItem* item, int column);public Q_SLOTS:void recvTreeItemData(QTreeWidgetItem* item, int column);private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

实现文件

#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QDebug>
#include <QGridLayout>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);m_widget = new QWidget();m_tree = new QTreeWidget;m_tree->setColumnCount(1);m_tree->setHeaderLabel(u8"英雄");m_treeItem = new QTreeWidgetItem(m_tree);m_treeItem->setText(0, u8"放逐之刃·瑞雯");m_data = new UserTest();m_data->m_imgPath = ":/Picture/Images/ruiwen.png";m_data->m_itemType = 1;m_treeItem->setData(0, Qt::UserRole + 1, QVariant::fromValue(m_data));m_tree->addTopLevelItem(m_treeItem);QTreeWidgetItem* itemBountyHunter = new QTreeWidgetItem(m_tree);itemBountyHunter->setText(0, u8"赏金猎人·厄运小姐");m_data1 = new UserTest;m_data1->m_imgPath = ":/Picture/Images/ruiwen.png";m_data1->m_itemType = 1;itemBountyHunter->setData(0, Qt::UserRole + 2, QVariant::fromValue(m_data1));//   m_layout = new QGridLayout;
//   m_layout->addWidget(m_tree, 0, 0);
//   m_widget->setLayout(m_layout);
//   m_widget->show();m_tree->show();void (QTreeWidget::*curChangeSignal)(QTreeWidgetItem *item, int column) = &QTreeWidget::itemClicked;void (MainWindow::*on_curChangeSlot)(QTreeWidgetItem* item, int column) = &MainWindow::recvTreeItemData;//   QObject::connect(m_tree, MainWindow::clickSendTreeItemData(QTreeWidgetItem* item, int column), this, &MainWindow::recvTreeItemData);connect(m_tree, curChangeSignal, this, on_curChangeSlot);connect(m_tree, curChangeSignal, this, &MainWindow::recvTreeItemData);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::recvTreeItemData(QTreeWidgetItem* item, int column)
{QString name = item->data(0, Qt::UserRole + 1).toString();int type = item->data(0, Qt::UserRole + 1).toInt();qDebug() << "英雄:" <<  name << "位置" << type;}

main

#include "MainWindow.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

二、编译错误

编译时发现错误
error: C2338: Type is not registered, please use the Q_DECLARE_METATYPE macro to make it known to Qt’s meta-object system

网上大部分解答都是添加:Q_DECLARE_METATYPE(type)

可我的代码中明明就有:Q_DECLARE_METATYPE(UserTest)

三、问题解决

非常感谢 BloodRose 给出的解答
今天遇到了莫名其妙的编译错误,原因是我用QVariant设置一个自定义指针类型的Data,这时就需要Q_DECLARE_METATYPE(Type*)了,如果设置了Q_DECLARE_METATYPE(Type),Qt只能识别Type类型,而未能识别其指针类型!!!

另外自定义类型中一定要有默认构造函数,如果已经显式的定义了带有无默认参数的构造函数则需要另外写上默认构造函数 Test(){}。

还有为保证不出其他莫名其妙的错误,最好在类定义的头文件中加上#include ,保证编译器能够识别该宏。

在我的代码中修改
把:Q_DECLARE_METATYPE(UserTest)
改成
Q_DECLARE_METATYPE(UserTest*)
就是把类型改成指针

四、源码下载

源码下载地址

五、运行效果


error: C2338: Type is not registered, please use the Q_DECLARE_METATYPE macro to make it known to Qt相关推荐

  1. error C2338: /RTCc rejects conformant code错误解决

    在编译一个项目时,发现在调试版本时提示这个出错: 1>------ 已启动生成: 项目: simulation2, 配置: Debug Win32 ------ 1>precompiled ...

  2. \src\core\plainobjectbase.h(311): error C2338: YOU_TRIED_CALLING_A_VECTOR_METHOD_ON_A_MATRIX

    \src\core\plainobjectbase.h(311): error C2338: YOU_TRIED_CALLING_A_VECTOR_METHOD_ON_A_MATRIX 其实就是正常的 ...

  3. avisynth_c.h:825:3: error: unknown type name ‘HMODULE’

    avisynth_c.h:825:3: error: unknown type name 'HMODULE' In file included from input/avs.c:49:0: ./ext ...

  4. 编译时错误之 error C2338: tuple_element index out of bounds

    part 1 编译器 vs2015 VC++. 完整的错误信息粘贴如下: d:\program files (x86)\microsoft visual studio 14.0\vc\include\ ...

  5. NDK编译c包含C++头文件时,出现 error: unknown type name 'class' 的解决方法

    在进行native开发的时候,难免会遇到C文件包含C++头文件而调用C++函数,若没做什么处理,直接include进行编译的话,会遇到以下错误: error: unknown type name 'c ...

  6. 训练caffe:registry.count(type) == 0 (1 vs. 0) Solver type Nesterov already registered

    命令:./continue-train.sh 内容:../../caffe-master/build/tools/caffe train -gpu=$1 -solver=solver.prototxt ...

  7. error C2039: “type”: 不是“cv::DataTypeT”的成员 解决办法

    编译opencv4.0.x版本的程序时,由于个人疏忽致使opencv 函数参数顺序调用错误,但是编译时没有提示该语句参数顺序错误,提示以下错误: g:\library\opencv-master\bu ...

  8. {“error“:{“root_cause“:[{“type“:“script_exception“,“reason“:“compile error“,“script_stack“:[“... par

    前言 最近想更新ES里面已经存在的数据,报错 错误如下 {"error":{"root_cause":[{"type":"scri ...

  9. 解决error: unknown type name ‘__u8’问题,认识__u8,__u16,__u32,__u64的大小及作用

    1.解决Linux error: unknown type name '__u8'问题: 内核提供的数据类型都在头文件<asm/types.h>声明,可以在程序中加上#include &l ...

最新文章

  1. 【c++】【转】如何只在heap上创建对象,如何只在stack上建立对象?
  2. Impala使用笔记(一)
  3. FIFOQueue '_4_batch_processing/batch_join/fifo_queue' is closed and has insu
  4. 一年三篇IF大于7的牛人告诉你怎么写SCI
  5. Scala调用Java静态成员及静态方法注意点——只能通过当前类名调用而不能借助子类调用父类静态成员/方法
  6. sql两个数字之差取最接近的_从零学DAX/Sql/Python030203SQL数据分类汇总续篇
  7. dlna和miracast可以共存吗_AirPlay、DLNA、Miracast三大无线技术介绍
  8. mysql数据库+ssh框架_SSH框架+Mysql数据库开发java web会员积分消费管理系统
  9. PyQt5笔记(05) -- 绝对位置
  10. Python的解释器和字节码
  11. SSH 框架 没加commons-beanutils-1.7.0.jar包的错误提示
  12. mysql can't open file: '..frm'_mysqldump 导出数据时出现can’t opne file ‘xx.frm’ (errno:24)错误...
  13. layui模板引擎laytpl判断为null或为空
  14. 一个工作三年左右的Java程序员跟大家分享从业心得
  15. 情人节,教你用Python定时给小姐姐微信发送专属问候!
  16. php query参数解析,php http_build_query()函数实例讲解
  17. CAD 系统变量参数大全
  18. 【优化求解】基于天牛须算法PID控制器优化设计matlab代码
  19. 四川店盈通电子商务有限公司:《零售的哲学》中的最基本观点“以用户为中心”
  20. 全球及中国BT筒夹行业投资建议与前景策略分析报告2022版

热门文章

  1. Masked Autoencoders
  2. 大数据开发课程:大数据开发培训课程
  3. Python 中的正则表达式全部用法速查
  4. 怎么查服务器芯片组,服务器芯片组
  5. linux scp连不上主机,如何使用WinSCP连接Linux主机
  6. 操作系统之动态分区分配与回收—C语言实现
  7. 国开大学 C语言程序 形考任务4,[国家开放大学] 国开电大人体生理学形考任务4...
  8. nas文件服务器访问限制,nas文件服务器远程访问
  9. 8.房价预测基础线性回归
  10. 查找最小的k 个元素