在Qt应用程序中似乎无法识别插槽

时间:2009-09-08 16:22:53

标签: c++ qt qt4 signals-slots

我最近一直在努力学习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()

这样的事情

4 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

什么是runBtn,它是如何创建的?如果它是作为ui文件的一部分创建的,您是否正在调用setupUi()?你的窗口类是如何创建的?您似乎省略了可能出现错误的代码(// ...)。

我可以给出最好的建议,尝试将问题减少到一个非常小的可编译示例。这有两个原因:

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

答案 3 :(得分:0)

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

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