2011-07-18 57 views
4

问题在于,每次从我的主窗口启动“设置”窗口时,我都会在Qt Creator中不断收到'No Slot'运行时错误。我发现Qt到目前为止是非常直观的,而且这个插槽的信号概念似乎只是简单地传递变量或函数调用而已。基本上,我有一个设置选项的菜单,单击时,打开一个设置窗口,需要从用户中获取一个双精度,并在主窗口中更新一个var。QT:没有这样的插槽

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; 
}; 

设置窗口具有的newval设置为作为双LE1中用户输入发射的ValChanged信号接受按钮它调用接受()。

SettingsWindow.cpp

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

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

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这台theVal由用户指定的值。大多数时候我看到一个问题,不包括Q_OBJECT宏的人,但我已经包括它两次。有关为什么这不起作用的任何建议?

+0

你是moc文件好吗?你可以在'qt_metacall(QMetaObject :: Call _c,int _id,void ** _ a)'中看到你的插槽吗? – vrince

+0

是的,它在那里。它应该全部被定义。 – user850275

+0

有几个问题需要澄清。哪个插槽在错误信息中命名为“No such slot”?如何调用“接受”插槽? –

回答

3

您遇到的问题几乎肯定是由于moc文件未被重新创建,连接调用中的拼写错误或有关插槽声明中的拼写错误。

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

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

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

+0

嗯,我会考虑这个。我希望有人会在教程中发表或者一路上发表的。我也很清楚,直到MainWindow的析构函数被打开的实例,这只是一个概念证明。 – user850275

+0

我可以理解你的挫败感,特别是如果你之前没有使用过窗口框架。这是一个需要熟悉的庞大的图书馆。 Qt是最好的文档库之一,您将找到丰富的示例和演示。不幸的是,其中大多数都针对单个项目,缺乏全面的,最佳实践“应用”示例。有时你会发现其中一个演示或例子会产生有价值的信息作为副作用。这里的Qt程序员非常友好和乐于助人,所以不断提出问题。 –

+0

非常感谢您的帮助!我决定使用你描述的方法来设置一个getter来完成这项工作,而且它现在似乎正在工作。考虑解决这个问题。 – user850275

7

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

+1

请指定。我不清楚你到底做了什么。 – dhein

0

我错误地试图通过一个参数到我的插槽没有QSignalMapper,我从this SO帖子了解到。

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

是的,我是Qt n00b。时间与QSignalMapper重构:)

HTH

1

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

我使用QT命令提示符选项,这样所有的路已经设置:

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

没有什么错我的代码,我的生成文件没有任何MOC命令,我可以看到。这适用于我尝试过的所有示例。我希望有人也可以试试这个。在我找到原因之前,我进行了近85个小时的实验。

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

相关问题