0

最近一直在学习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

4 回答 4

8

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

class Window : public QWidget
{
Q_OBJECT
public:
    Window()
...
于 2009-09-08T16:26:26.800 回答
2

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

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

于 2010-06-11T20:07:07.753 回答
1

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

我可以给出的最佳建议是尝试将您的问题简化为一个非常小的可编译示例。这有两个原因:

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

希望这可以帮助。

于 2009-09-09T07:20:46.580 回答
0

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

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

于 2009-09-28T12:15:30.550 回答