use*_*275 4 user-interface qt signals-slots qt-creator
问题是我每次从主窗口启动'设置'窗口时都会在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;
};
Run Code Online (Sandbox Code Playgroud)
设置窗口有一个接受按钮,它调用Accept(),它发出ValChanged信号,newVal设置为le1中的用户输入为double.
SettingsWindow.cpp
void SettingsWindow::Accept(){
emit ValChanged(le1->text().toDouble());
this->close();
}
Run Code Online (Sandbox Code Playgroud)
该设置窗口由应用程序的主窗口调用: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;
};
Run Code Online (Sandbox Code Playgroud)
这个主窗口有一个菜单,可以从中选择设置.这将创建一个新窗口,其中包含一个输入数字的字段.
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;
}
Run Code Online (Sandbox Code Playgroud)
我希望当打开设置窗口时,用户可以在字段中输入val,然后发出ValChanged信号,将Val设置为用户指定的值.大多数时候我看到人们不包括Q_OBJECT宏的问题,但我已经把它包括在内.为什么这不起作用的任何建议?