用户界面- QT:没有这样的插槽



问题是,每当我从主窗口启动'设置'窗口时,我一直在Qt Creator中获得'No Such Slot'运行时错误。我发现Qt到目前为止是相当反直觉的,这个插槽的n个信号的概念似乎有点延伸,从简单地传递变量或函数调用。基本上,我有一个菜单设置选项,当点击时,打开一个设置窗口,需要从用户获取一个double,并在主窗口更新一个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按钮,该按钮调用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宏,但我两次都包含了它。有什么建议为什么这不起作用吗?

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

您遇到的问题几乎可以肯定是由于没有重新创建moc文件,在连接调用中出现错字或在有问题的插槽声明中出现错字。

您可能会认为这比从对话框中获取输入所需的工作要多得多。一种更简单的方法是将"接受"按钮点击信号连接到主窗口的插槽,然后通过getXXX()方法直接从设置窗口的实例中获取您想要的值。

如果你最终有一个有很多值的设置对话框,而不是通过getter获取每个值,让"接受"按钮信号返回一个结构体,其中所有值作为该结构体的字段。

我应该提到,看起来NewWindow()每次被调用时都会创建一个新的SettingsWindow实例。所有这些实例将一直存在,直到MainWindow被销毁。

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

我使用qt命令提示选项,所以所有的路径已经设置:

cd /path/to/my/project
moc -o moc_myheaderfile.cpp myheaderfile.h
我的代码没有任何问题,我的makefile没有任何我能看到的moc命令。这对我尝试过的所有例子都有效。我希望有人也能尝试一下。我试验了将近85个小时才找到原因。

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

我错误地试图将参数传递到我的插槽而没有QSignalMapper,这是我从这个SO帖子中学到的。

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

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

HTH

相关内容

  • 没有找到相关文章

最新更新