2009-09-08 116 views
0

最近我一直在学习C++和Qt4,但是我碰到了一个绊脚石。在Qt应用程序中似乎无法识别的插槽

我有以下类和执行:

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似乎并没有被识别nizing插槽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()

+0

这段代码*直*从您的实际代码copypaste?如果你的run()插槽有参数,但你没有在SLOT宏中定义,通常会发生你描述的错误。也就是说,在运行时出现相同的错误,而不是崩溃。此外,你也应该打电话给父母的构造函数。 – rasjani 2009-09-08 20:33:53

+0

我们不能告诉你为什么它会从你粘贴的代码崩溃。在你编写但未显示的其他代码中可能存在一个错误。 – rohanpm 2009-09-09 01:01:38

+0

“公共插槽:”,这是如何工作的?从来没有见过这种语法 – 2009-09-09 07:30:32

回答

8

可能您忘记了Window类中的Q_OBJECT宏?

class Window : public QWidget 
{ 
Q_OBJECT 
public: 
    Window() 
... 
+0

显然,是的。但是,我添加它后,它仍然立即崩溃,并退出代码0. – 2009-09-08 16:47:36

+0

@奥斯汀,不要忘记这样做后重新运行qmake,因为它需要将您的文件添加到要运行的项目列表MOC,这也会影响运行时的行为。 – 2009-09-08 17:18:21

+0

你有堆栈跟踪吗?无论如何,我推荐阅读Qt教程,这是Qt文档的一部分。他们写得很好,一步一步来。另外还有很多使用最常见的类的例子,值得一看。 – hirschhornsalz 2009-09-08 17:19:15

1

什么是runBtn,它是如何创建的?如果它是作为ui文件的一部分创建的,你打电话给setupUi()?你的窗口类是如何创建的?你似乎已经省略了一些代码(// ...),这可能是错误的地方。

我可以给你的最好的建议,试图减少你的问题,以一个非常小的可编译的例子。这有助于有两个原因:

  1. 它可以帮助你诊断的问题,因为会更少的代码来看看。
  2. 如果您仍需要我们的帮助,它会帮助我们因为我们将有一个完整的代码库,我们可以下载,编译和调试。通常问题不在你认为的地方。

希望这会有所帮助。

0

看起来runBtn在调用connect时没有被实例化 - 正如其他答案之一所暗示的那样。

使用断点来检查崩溃发生的位置。

2

那么我也有这个问题,并且可能在网上找不到任何帮助。我发现我忘记在重新编译之前删除moc_ *文件,它使用旧的moc文件来创建可执行文件。这导致它不知道我编码的任何新插槽。如果所有其他建议都失败了,我会检查一下。

有时最简单的解决方案是最好的解决方案...

相关问题