QT: нет такого слота - PullRequest
       21

QT: нет такого слота

4 голосов
/ 18 июля 2011

Проблема в том, что я продолжаю получать ошибку времени выполнения «Нет такого слота» в Qt Creator каждый раз, когда запускаю окно «Настройки» из моего главного окна. До сих пор я обнаружил, что Qt довольно нелогичен, и эта концепция слотов с n-сигналами кажется немного натянутой от простой передачи переменных или вызовов функций. По сути, у меня есть меню с опцией настроек, при нажатии на которую открывается окно настроек, в котором нужно получить двойную у пользователя и обновить переменную в главном окне.

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 ]

7 голосов
/ 16 октября 2012

Для меня добавление public Q_SLOTS: над функцией слота было то, чего мне не хватало.(У меня уже был Q_OBJECT и т. Д.)

3 голосов
/ 18 июля 2011

Проблема, с которой вы столкнулись, почти наверняка связана с тем, что moc-файл не воссоздается, опечатка в вашем вызове connect или опечатка в объявлении соответствующего слота.

Возможно, вы захотите учесть, что это намного больше работы, чем необходимо для получения ввода из диалога. Более простым способом было бы подключить сигнал нажатия кнопки «Принять» к слоту в главном окне, а затем извлечь нужное значение непосредственно из экземпляра окна настроек с помощью метода getXXX().

Если в конечном итоге у вас есть диалоговое окно настроек с большим количеством значений, вместо того, чтобы извлекать каждое значение через геттеры, пусть сигнал кнопки «Принять» возвращает структуру со всеми значениями в качестве полей этой структуры.

Я должен упомянуть, что похоже, что NewWindow() создает новый экземпляр SettingsWindow каждый раз, когда он вызывается. Все эти экземпляры будут сохраняться до тех пор, пока MainWindow не будет уничтожен.

2 голосов
/ 15 мая 2015

Я решил свою проблему, когда вручную воссоздал свой файл moc в командной строке.

Я использовал опцию командной строки qt, поэтому все пути были установлены:

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

ничего плохого в моем коде, и в моем make-файле не было никакой команды moc, которую я мог видеть.Это работает для всех моих примеров, которые я пробовал.Я надеюсь, что кто-то может попробовать это тоже.Я экспериментировал почти 85 часов, прежде чем смог найти причину.

Для пользователей кодовых блоков попробуйте воссоздать ваши moc-файлы, чтобы быть точным.опция -o myheaderfile.cpp предназначена для сохранения вывода moc в файл.Запуск moc над файлом фактически извергает все в окно консоли.

0 голосов
/ 24 октября 2013

Я неправильно пытался передать параметр в свой слот без QSignalMapper, что я узнал из этого ТАКОГО сообщения.

Удаление всех параметров в функции слота (.h и .cpp) позволило найти и вызвать обратный вызов.

Да, я Qt n00b. Время на рефакторинг с QSignalMapper:)

НТН

...