c++ QObject::connect:无法对类型为“int&”的参数进行排队

gdx19jrr  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(68)

我试着这样做:

connect(this, SIGNAL(signalClicked(int&)),  classA, SLOT(doWork(int&)));

字符串
但我从标题中得到了信息。所以我在互联网上探索了一下,我想出了这个解决方案,它也不起作用:

qRegisterMetaType<int&>("Type");
 connect(this, SIGNAL(signalClicked(Type)),  classA, SLOT(doWork(Type)));


错误:没有匹配的函数用于调用“qRegisterMetaType(const char[5])”
有什么办法吗?

ggazkfy8

ggazkfy81#

如果Qt试图将参数排队,这意味着连接是在线程之间进行的。这对非常量引用无效。
你可以使用reference_wrapper来解决这个问题,但我强烈建议你重新考虑你的设计,在信号/插槽连接中通过引用传递值不是一个好主意。

b0zn9rqh

b0zn9rqh2#

我希望能够用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);


然后在我的主类(a 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);


我觉得它相当复杂,但这正如预期的那样。

相关问题