Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1226|回复: 0
打印 上一主题 下一主题

Qt 中,如何通过QAction::setData , 传送自定义的数据 Q_DECLARE_METATYPE

[复制链接]

1228

主题

1998

帖子

7598

积分

认证用户组

Rank: 5Rank: 5

积分
7598
跳转到指定楼层
楼主
发表于 2020-3-17 17:26:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    最近,项目中有这样的需求,通过QAction::setData , 传送自定义的数据。在网上查了很多的资料,都是模模糊糊的说几句,都没有说到点子上,更有人给出了完全违背Qt理念的解决方案。下面就是我写的一个例子代码:
1、自定义数据:
在此,以自定义的类为例子,代码如下:
//.h
#ifndef QNEWITEM_H
#define QNEWITEM_H
#include <QObject>
class QNewItem : public QObject
{
public:
QNewItem(QObject *parent = 0);
~QNewItem();
bool setUserInfo(QString& strName,qint16& nAge);
private:
QString m_strName;
qint16 m_nAge;
};
#endif // QNEWITEM_H


//.cpp
#include "qnewitem.h"

QNewItem:NewItem(QObject *parent)
: QObject(parent)
{
}

QNewItem::~QNewItem()
{
}
bool QNewItem::setUserInfo( QString& strName,qint16& nAge )
{
bool bRet = false;
do
{
if( strName.isEmpty() || nAge >200 && nAge<0 ) break;
m_strName = strName;
m_nAge = nAge;
bRet = true;
} while (false);
return bRet;
}

2、在调用的CPP开头,必须定义这样声明:
#include "qnewitem.h"
Q_DECLARE_METATYPE(QNewItem*)  

其他的就没什么好说的了,看代码,你们的都懂的。

#include "qnewitem.h"
Q_DECLARE_METATYPE(QNewItem*)
customDefineDemo::customDefineDemo(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
connect(ui.pushButton , SIGNAL(clicked()),this,SLOT(onBtnClick()));
}
customDefineDemo::~customDefineDemo()
{
}
void customDefineDemo:nBtnClick()
{
QMenu* pMenu = new QMenu();
QNewItem* pNewItem = new QNewItem();
qint16 nAge = 34;
QVariant qv;
do
{
QAction* pPortraitView = new QAction(tr("New"), this);
QAction* pAddGroup = new QAction(tr("Open"), this);
QAction* pDeleteGroup = new QAction(tr("Save"), this);
pNewItem->setUserInfo(tr("Eric"),nAge);
pPortraitView->setData( QVariant::fromValue(pNewItem) ) ;
connect(pPortraitView,SIGNAL(triggered()),this,SLOT(triggeredMenuSendMsgContact()));

pMenu->addAction(pPortraitView);
pMenu->addAction(pAddGroup);
pMenu->addAction(pDeleteGroup);
pMenu->exec(QCursor::pos());
} while (false);
if( pMenu != nullptr )
{
delete pMenu;
pMenu = nullptr;
}
}
void customDefineDemo::triggeredMenuSendMsgContact()
{
QAction* pSendMsg= NULL;
QNewItem* pObj = NULL;
do
{
pSendMsg=qobject_cast<QAction*>(sender());
pObj = pSendMsg->data().value<QNewItem*>();
} while (false);
if( pObj != nullptr )
{
delete pObj;
pObj = nullptr;
}
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-5-18 05:35 , Processed in 0.110063 second(s), 20 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表