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

Can't connect signal to slot of own class

本文关键字:自己 插槽 连接 信号      更新时间:2023-10-16

我需要使用可以包含链接的QGraphcisTextItem,所以我基于此创建了自己的类。这是标题:

class ClickableGraphicsTextItem : public QGraphicsTextItem
{
public:
    ClickableGraphicsTextItem();
    void setHtml(const QString &html);
public slots:
    void linkClicked(QString link);
protected:
    void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
};

和菲共

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)

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

我该如何解决这个问题?

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

  • 传统上,使用SIGNAL()宏和SLOT()宏。
  • 使用新的信号槽语法。

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

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


1) 虽然仍然需要为所有包含信号或插槽的类添加 Q_OBJECT 宏,但有时从 QObject 派生就足够了。但是,这不是合同性的,应被视为(未记录的)实现细节。
首先,

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

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

它应该正常工作。