无法将信号连接到自己类的插槽

时间:2016-07-07 10:05:19

标签: c++ qt

我需要使用可以包含链接的QGraphcisTextItem,以便我根据此创建自己的类。这是标题:

class ClickableGraphicsTextItem : public QGraphicsTextItem
{
public:
    ClickableGraphicsTextItem();
    void setHtml(const QString &html);

public slots:
    void linkClicked(QString link);

protected:
    void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);

};

和CPP

ClickableGraphicsTextItem::ClickableGraphicsTextItem()
{
    connect(this,SIGNAL(linkActivated(QString)),this,SLOT(linkClicked(QString)));
}

void ClickableGraphicsTextItem::setHtml(const QString &html){
    QGraphicsTextItem::setHtml(html);
    qWarning() << "HTML Was set";
}

void ClickableGraphicsTextItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event){
    qWarning() << "I was double cliked";
}

void ClickableGraphicsTextItem::linkClicked(QString link){
    qWarning() << "Link" << link << "was clicked";
}

现在,当我运行程序时,我在输出控制台中收到此消息错误:

QObject::connect: No such slot QGraphicsTextItem::linkClicked(QString)

现在我不明白为什么它试图连接到我的ClickableGrapchicsTextItem的QGraphicsTextItem。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

Qt中的

Signals & Slots可以通过以下两种方式之一实现:

使用SIGNAL()SLOT()宏时,信号槽连接是在运行时构造的。这是通过基于字符串的查找来执行的。为此,元对象编译器(MOC)需要提供附加信息,这些信息可通过将Q_OBJECT宏添加到类声明的顶部来实现。

使用新的信号槽语法不再需要元对象编译器的帮助 1)。连接在编译时实现,仅使用标准C ++功能。基于字符串的查找已被函数指针替换。

<小时/> 1) 虽然仍然需要为包含信号或槽的所有类添加Q_OBJECT宏,但有时从QObject派生它就足够了。但这不是契约性的,应该被视为(未记录的)实现细节。

答案 1 :(得分:0)

首先,您应该在类声明中添加Q_OBJECT。

class ClickableGraphicsTextItem : public QGraphicsTextItem
{Q_OBJECT
public:
    ...
    ...
    ...

}

它应该正常工作。