在 Qt 应用程序中似乎无法识别插槽 [重复]
Posted
技术标签:
【中文标题】在 Qt 应用程序中似乎无法识别插槽 [重复]【英文标题】:Slot seemingly not recognized in Qt app [duplicate] 【发布时间】:2009-09-08 16:22:53 【问题描述】:最近一直在学习C++和Qt4,但是遇到了一个绊脚石。
我有以下类和实现:
class Window : public QWidget
public:
Window();
public slots:
void run();
private:
//...
;
和
Window::Window()
//...
connect(runBtn,SIGNAL(clicked()),this,SLOT(run()));
//...
Window::run()
//...
但是,当我尝试构建并运行它时,虽然它构建得很好,但它会立即退出并显示消息
Object::connect: No such slot QWidget::run()
除非我做错了什么,否则 Qt 似乎无法识别插槽 run()
有人可以帮忙吗?
更新:
现在的代码是:
class Window : public QWidget
Q_OBJECT
public:
Window(QWidget *parent = 0);
public slots:
void run();
private:
//...
;
和
Window::Window(QWidget *parent) : QWidget(parent)
//...
connect(runBtn,SIGNAL(clicked()),this,SLOT(run()));
//...
Window::run()
//...
程序还是“意外结束”,但不再告诉我没有QWidget::run()
这样的东西
【问题讨论】:
这段代码是从您的实际代码中直接复制粘贴的吗?因为如果您的 run() 插槽有参数但您没有在 SLOT 宏中定义,通常会发生您描述的错误?也就是说,在运行时出现同样的错误,而不是崩溃。另外,你也应该调用父母的构造函数。 我们无法告诉您为什么它会因您粘贴的代码而崩溃。您编写但未显示的其他代码中可能存在错误。 "公共插槽:",它是如何工作的?没见过这种语法? 不要忘记在你的 *.pro 文件中将 header 添加到 HEADERS,然后重新运行 qmake 【参考方案1】:您可能在 Window 类中忘记了 Q_OBJECT 宏?
class Window : public QWidget
Q_OBJECT
public:
Window()
...
【讨论】:
显然,是的,我有。但是,在我添加它之后,它仍然立即崩溃,并以代码 0 退出。 @Austin,不要忘记在执行此操作后重新运行 qmake,因为它需要将您的文件添加到运行 MOC 的项目列表中,这也会影响在运行时。 你有堆栈跟踪吗?无论如何,我建议阅读 Qt 教程,它们是 Qt 文档的一部分。他们写得很好,一步一步地走。此外,还有很多使用最常见类的示例,也值得一看。 我正在使用 qt creator IDE,所以(我相信)它会在构建时自动执行此操作。我手动运行了 qmake,但它仍然崩溃,减去关于“没有这样的插槽”的错误。 @drhirsch 我确实通读了教程,甚至浏览了一些文档并查看了所有相关示例。【参考方案2】:好吧,我也遇到了这个问题,在网上找不到任何帮助。我发现我忘记在重新编译之前删除 moc_* 文件,它正在使用旧的 moc 文件来创建可执行文件。这导致它不知道我编码的任何新插槽。如果所有其他建议都失败了,我会检查一下。
有时最简单的解决方案就是最好的解决方案......
【讨论】:
【参考方案3】:什么是runBtn
,它是如何创建的?如果它是作为 ui 文件的一部分创建的,您是在调用 setupUi()
吗?您的窗口类是如何创建的?您似乎省略了一些可能是错误所在的代码 (// ...
)。
我可以给出的最佳建议是尝试将您的问题简化为一个非常小的可编译示例。这有两个原因:
-
它可以帮助您诊断问题,因为要查看的代码会更少。
如果您仍然需要我们的帮助,它会帮助我们,因为我们将拥有一个完整的代码库,我们可以下载、编译和调试。问题通常不在您认为的位置。
希望这会有所帮助。
【讨论】:
【参考方案4】:看起来 runBtn 在调用 connect 时没有实例化——正如其他答案之一所暗示的那样。
使用断点检查崩溃发生的位置。
【讨论】:
以上是关于在 Qt 应用程序中似乎无法识别插槽 [重复]的主要内容,如果未能解决你的问题,请参考以下文章