Проблема в том, что я продолжаю получать ошибку времени выполнения «Нет такого слота» в Qt Creator каждый раз, когда я запускаю окно «Настройки» из своего главного окна. Я обнаружил, что Qt до сих пор был довольно нелогичным, и эта концепция слотов и сигналов кажется немного натянутой по сравнению с простой передачей переменных или вызовов функций. По сути, у меня есть меню с параметром настроек, при нажатии которого открывается окно настроек, в котором необходимо получить двойное значение от пользователя и обновить переменную в главном окне.
НастройкиWindow.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 как двойной.
НастройкиWindow.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 Signal, который устанавливает для Val значение, указанное пользователем. В большинстве случаев я видел проблему с тем, что люди не включали макрос Q_OBJECT, но я включал его оба раза. Любые предложения о том, почему это не работает?
qt_metacall(QMetaObject::Call _c, int _id, void **_a)
? - person Thomas Vincent   schedule 18.07.2011No such slot: MainWindow::SetVal(double)
(безx
). Если сообщение об ошибке правильное, и ваш код действительноSLOT(SetVal(double x))
, вы можете решить проблему, удалив файлx
. - person TonyK   schedule 19.07.2011