QT:没有这样的插槽

时间:2011-07-18 15:39:44

标签: qt user-interface qt-creator signals-slots

问题是每次我从主窗口启动'设置'窗口时,我都会在Qt Creator中得到'No Such Slot'运行时错误。到目前为止,我发现Qt是非常反直觉的,这个插槽信号概念似乎只是通过简单传递变量或函数调用。基本上,我有一个带有设置选项的菜单,当点击它时,会打开一个设置窗口,需要从用户手中获取一个双精度并更新主窗口中的var。

SettingsWindow.h

class SettingsWindow : public QWidget
{
      Q_OBJECT
  public:
      SettingsWindow(QWidget *parent = 0);
  signals:
      void ValChanged(double newVal);
  public slots:
      void Accept();
  private:
      QLineEdit *le1;
};

设置窗口有一个接受按钮,它调用Accept(),它发出ValChanged信号,newVal设置为le1中的用户输入为double。

SettingsWindow.cpp

void SettingsWindow::Accept(){
    emit ValChanged(le1->text().toDouble());
    this->close();
}

此设置窗口由应用程序的主窗口调用:MainWindow

MainWindow.cpp

class MainWindow : public QMainWindow
{
      Q_OBJECT  
  public:
      MainWindow(QWidget *parent = 0);
  public slots:
      void SetVal(double x);
  private slots:
      void NewWindow();
  private:
      double theVal;
};

此主窗口有一个菜单,可以从中选择设置。这将创建一个新窗口,其中包含一个输入数字的字段。

MainWindow.cpp

void MainWindow::NewWindow()
{
    SettingsWindow *MySettings=new SettingsWindow(this);
    QObject::connect(MySettings, SIGNAL(ValChanged(double)), this, SLOT(SetVal(double)));
    MySettings->show();
    MySettings->raise();
}

void MainWindow::SetVal(double x){
    theVal = x;
}

我希望当打开设置窗口时,用户可以在字段中输入val,然后发出ValChanged信号,将Val设置为用户指定的值。大多数时候我看到人们不包括Q_OBJECT宏的问题,但我已经把它包括在内。有关为什么不起作用的任何建议?

4 个答案:

答案 0 :(得分:7)

对我来说,在我的插槽功能上方添加public Q_SLOTS:就是我所缺少的。 (我已经有了Q_OBJECT等)

答案 1 :(得分:3)

您遇到的问题几乎可以肯定是因为没有重新创建moc文件,您在连接调用中输入错误或在相关插槽的声明中输入错字。

您可能需要考虑从对话框获取输入所需的工作量远远超过必要的工作量。一种更简单的方法是将“Accept”按钮单击信号连接到主窗口中的插槽,然后通过getXXX()方法直接从设置窗口的实例中获取所需的值。

如果你最终有一个包含很多值的设置对话框,而不是通过getter获取每个值,请让“Accept”按钮信号返回一个结构,其中所有值都是该结构的字段。

我应该提一下,NewWindow()每次调用时都会创建一个SettingsWindow的新实例。所有这些实例都将持续到MainWindow被销毁。

答案 2 :(得分:2)

当我在命令行上手动重新创建我的moc文件时,我解决了我的问题。

我使用了qt命令提示符选项,因此已经设置了所有路径:

cd /path/to/my/project
moc -o moc_myheaderfile.cpp myheaderfile.h

我的代码没有任何问题,我的makefile没有任何我能看到的moc命令。这适用于我尝试过的所有示例。我希望有人也可以试试这个。在我找到原因之前,我进行了近85个小时的实验。

对于codeblocks用户,请尝试重新创建moc文件。 -o myheaderfile.cpp选项是将moc输出保存到文件中。 在文件上运行moc实际上会将所有内容都喷到控制台窗口上。

答案 3 :(得分:0)

我错误地尝试将参数传递到我的广告位而没有QSignalMapper,这是我从this SO帖子中学到的。

删除槽函数(.h和.cpp)的所有参数允许找到并调用回调。

是的,我是Qt n00b。是时候用QSignalMapper重构:)

HTH