我需要使用可以包含链接的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。
我该如何解决这个问题?
答案 0 :(得分:1)
Signals & Slots可以通过以下两种方式之一实现:
SIGNAL()
和SLOT()
宏。使用SIGNAL()
和SLOT()
宏时,信号槽连接是在运行时构造的。这是通过基于字符串的查找来执行的。为此,元对象编译器(MOC)需要提供附加信息,这些信息可通过将Q_OBJECT宏添加到类声明的顶部来实现。
使用新的信号槽语法不再需要元对象编译器的帮助 1)。连接在编译时实现,仅使用标准C ++功能。基于字符串的查找已被函数指针替换。
<小时/> 1) 虽然仍然需要为包含信号或槽的所有类添加
Q_OBJECT
宏,但有时从QObject
派生它就足够了。但这不是契约性的,应该被视为(未记录的)实现细节。
答案 1 :(得分:0)
首先,您应该在类声明中添加Q_OBJECT。
class ClickableGraphicsTextItem : public QGraphicsTextItem
{Q_OBJECT
public:
...
...
...
}
它应该正常工作。