连接:没有这样的插槽 QTreeView

Posted

技术标签:

【中文标题】连接:没有这样的插槽 QTreeView【英文标题】:Connect: No such Slot QTreeView 【发布时间】:2014-03-06 10:33:11 【问题描述】:

我从QTreeview继承了一个类MainTree

ma​​intree.cpp 文件

void  MainTree::LaunchTree()

//Tree launching
 connect(this, SIGNAL(customContextMenuRequested(const QPoint& )),this,SLOT(showCustomContextMenu(const QPoint&)));


void MainTree::showCustomContextMenu(const QPoint &pos)  

  //Add actions


但我得到以下错误

QObject::connect: No such slot QTreeView::showCustomContextMenu(const QPoint&)

我不明白为什么,我错过了什么吗??

MainTree的定义

class MainTree : public QTreeView


public:
    MainTree();
    MainTree(QWidget *parent = 0);

public slots:

private slots:
    void showCustomContextMenu(const QPoint& pos);

private:
     void launchTree();

 ;

【问题讨论】:

你能显示MainTree的类定义吗? 您忘记在类声明的开头添加Q_OBJECT 宏。 我之前也尝试过这样做。但是当我添加宏 Q_OBJECTm 时,出现以下错误。 Q_OBJECT 抛出“未定义的 vtable 引用”错误 @user3387634 在构建项目之前不要忘记再次运行qmake 此错误通常表示构建缓存已损坏。清理项目并重新构建它。 【参考方案1】:

你错过了Q_OBJECT 宏,所以试试这个:

class MainTree : public QTreeView

Q_OBJECT
// ^^^^^
public:
    MainTree();
    MainTree(QWidget *parent = 0);

public slots:

private slots:
    void showCustomContextMenu(const QPoint& pos);

private:
     void launchTree();

 ;

不要忘记在此之后重新运行 qmake 以正确重新生成 moc 文件。确保在源代码的末尾包含 moc,或者在没有它的情况下处理 moc 生成。

另外,请注意,如果您使用支持 C++11 的 Qt 5.2 或更高版本,您将获得关于缺少 Q_OBJECT 宏的静态断言,因此您不会再遇到运行时问题。如果可以的话,我建议您遵循。

【讨论】:

【参考方案2】:

当提到槽和信号时,你必须把所有的装饰都加进去:const&等等(只有星星可以保留)。

connect(this, SIGNAL(customContextMenuRequested(QPoint)), 
        this, SLOT(showCustomContextMenu(QPoint)))

你也忘了Q_OBJECT宏。

【讨论】:

不,“foo(const X&)” 有效且有效。 “foo(X)” 和 “foo(const X&)” 在 connect() 完成签名规范化之后是等价的。“foo(X)” 是首选,因为它更简洁(并且稍微快一点,因为没有规范化是需要),但行为是相同的。 也许 Qt 文档说它可以工作,建议省略这个。 恐怕弗兰克是对的,或者至少我同意他的观点。他写道,Q_OBJECT 本身也没有帮助,所以我建议删除这个答案,因为它得到了这么多反对票,并且有更好的答案。当然,如果你愿意,你仍然可以留下来,这只是我的个人意见。

以上是关于连接:没有这样的插槽 QTreeView的主要内容,如果未能解决你的问题,请参考以下文章

Qt - 使用 lambda 函数修改先前连接信号的插槽参数

按名称使用自动连接插槽

QT没有这样的插槽[重复]

跟随发出的信号到其连接的插槽?

如何修复QObject::connect:没有这样的插槽..将发送者连接到同一类中的插槽时[重复]

PyQt:没有这样的插槽