подключение сигналов к слоту дочернего виджета

#c #qt #slot

#c #qt #слот

Вопрос:

У меня есть некоторые проблемы с наследованием в виджетах и соединительных слотах. Я создал абстрактный виджет, который наследуется от QWidget . Вот прототип :

 class WidgetParams : public QWidget
{
   Q_OBJECT
 public:
     explicit WidgetParams(QWidget *parent = 0) : QWidget(parent){}
     virtual bool paramChanged() = 0;
 protected:
      bool paramsChanged;
 };
  

Затем я создал производный класс WidgetParams , например WidgetParamsWindows :

 class WidgetParamsWindows : public WidgetParams
{
  public:
    explicit WidgetParamsWindows(QWidget *parent = 0);
    virtual bool paramChanged(){return paramsChanged;}
  private:
    QFormLayout *layout;
    QSpinBox *svertical;
    QSpinBox *shorizontal;
  signals:

  public slots:
    void changeSomeParam(int value);
};
  

У WidgetParamsWindows меня есть некоторые QSpinBox и QPushButton т. Д. для настройки параметров.

Я подключаю QSpinBox WidetParamsWindows таким образом :

 connect(spinbox,SIGNAL(valueChanged(int)),this,SLOT(changeSomeParam(int));
  

После этого я создал WidgetParamsWindows и поместил его в список WidgetParams , чтобы показать правильный WidgetParams , когда пользователь нажимает на него.

Но когда я попытался изменить значение в QSpinBox , ничего не изменилось, и в консоли появилось следующее сообщение :

 QObject::connect: No such slot WidgetParams::changeSomeParam(int)
  

Я не знаю, почему родительский виджет занимает слот, а WidgetParamsWindows не, у вас есть какие-либо идеи?

Комментарии:

1. Не могли бы вы поделиться еще каким-нибудь кодом (особенно определениями классов)? Вы Q_OBJECT также добавили макрос в WidgetParamsWindows ? Где changeSomeParam(int) объявлен слот?

Ответ №1:

В нем нет Q_OBJECT макроса WidgetParamsWindow , поэтому moc он не разрешает макросы слотов, попробуйте добавить Q_OBJECT WidgetParamsWindow

Комментарии:

1. Благодаря его работе, это был единственный макрос без Q_OBJECT, но теперь у меня проблема с «неопределенной виртуальной таблицей» при компиляции. Q_OBJECT должен добавить какое-либо объявление, чтобы работать? Я проверяю, что у меня есть другие WidgetParams, где я не забываю этот макрос и компиляцию для них.

2. @user3627590, вы запускали qmake перед компиляцией проекта?

3. Неопределенная vtable — это проблема с виртуальными функциями и полиморфизмом. Объявляете ли вы paramChanged() во всех классах, которые наследуются от WidgetParams ?

4. Да, это было так. Спасибо всем за ваши ответы и мои извинения за такую крошечную ошибку. Я знаю, что сигналы и слоты работают с макросом Q_OBJECT, но я не знал, что мы все равно можем объявить его, даже если макроса здесь нет, а затем родительский элемент принимает слоты, если макрос не объявлен в дочернем.