连接:没有这样的插槽 QTreeView
Posted
技术标签:
【中文标题】连接:没有这样的插槽 QTreeView【英文标题】:Connect: No such Slot QTreeView 【发布时间】:2014-03-06 10:33:11 【问题描述】:我从QTreeview
继承了一个类MainTree
maintree.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 函数修改先前连接信号的插槽参数