我想要能够将事件与一个
std::shared_ptr<>
连接起来。我所做的是创建一个包含该指针的结构体,并且这个结构体是我声明和用来发送事件的对象。
所以我有一个对象,像这样:
class project
{
typedef std::shared_ptr<project> pointer_t
...
}
我需要调用
Q_DECLARE_METATYPE()
来传递智能指针。所以我的第一个想法是:
Q_DECLARE_METATYPE(builder::project::pointer_t)
那根本没有起作用。所以我不得不创建一个带有指针的结构,并将其创建在命名空间之外(上面的
builder
)。
// outside my namespace
struct project_ptr
{
builder::project::pointer_t f_ptr = builder::project::pointer_t()
private:
Q_GADGET
}
Q_DECLARE_METATYPE(project_ptr)
然后在我的主类(一个
QWindow
)中,我有一个函数来发射信号,实际的信号,以及一个用来处理消息的槽函数:
class snap_builder
: public QMainWindow
, private Ui::snap_builder
{
private:
Q_OBJECT
public:
...
void project_changed(project::pointer_t p);
signals:
void projectChanged(project_ptr p);
private slots:
void onProjectChanged(project_ptr p);
...
};
如我们所见,类可以包含任何你想要的东西(几乎),但类型是通过复制来使用的(没有引用,没有指针)。
为了触发事件,我会调用
project_changed()
函数,该函数会创建一个带有项目指针的
project_ptr
,并使用Qt的
emit ...
功能发送它。
void snap_builder::project_changed(project::pointer_t p)
{
project_ptr ptr;
ptr.f_ptr = p;
emit projectChanged(ptr);
}
最后,你必须像这样连接那个事件,在我的构造函数中完成:
connect(this, &snap_builder::projectChanged,
this, &snap_builder::on_project_changed)
我觉得有点复杂,但是结果还是符合预期的。
#include <QMetaType>
? - Angew is no longer proud of SOQ_DECLARE_METATYPE
在哪里? - JBL