#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, но я не знал, что мы все равно можем объявить его, даже если макроса здесь нет, а затем родительский элемент принимает слоты, если макрос не объявлен в дочернем.