crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Какая то непонятка со слотами в наследованных класах
MishaUA
  опции профиля:
сообщение 18.6.2013, 17:04
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


Сам я в основном пишу Под микроконтроллеры на Си и в С++ не являюсь проффи. Сейчас столкнулся с проблемами при наследовании классов.
Вобщем, есть такой кусочек кода:

class cl1 : QObject {
    Q_OBJECT
public:
    int dgd;
};

class cl2 : public cl1 {
public:
    int dgd;
private slots:
    void sll();
};

в *.cpp:
void cl2::sll()
{
}

При компиляции ошибка mingw32-make[1]: *** [debug/classs.cpp] Error 1.
Если убрать функцию sll(), то ошибки нет.
Что я сделал не так?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ilyabvt
  опции профиля:
сообщение 18.6.2013, 17:38
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 297
Регистрация: 23.6.2011
Пользователь №: 2765

Спасибо сказали: 45 раз(а)




Репутация:   3  


Может потому что макрос Q_OBJECT отсутствует в объявлении класса cl2.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Steklova Olga
  опции профиля:
сообщение 18.6.2013, 17:46
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

Спасибо сказали: 5 раз(а)




Репутация:   4  


Цитата(MishaUA @ 18.6.2013, 17:04) *
Если убрать функцию sll(), то ошибки нет.
Что я сделал не так?

Сначала определись: sll() у тебя должен быть слотом или методом класса (как ты говоришь, функцией)?
Сейчас у тебя в коде указано, что sll() - это не просто функция, а слот.
А чтобы класс работал с сигналами и слотами, он должен быть потомком QObject.

Поэтому, если sll() действительно должен быть слотом, то в классе cl2 надо указать слово Q_OBJECT:
class cl2 : public cl1 {
  Q_OBJECT //<------------------тут
public:    
  int dgd;
private slots:    
  void sll();
};

Если же sll() должен быть private-методом класса, то его надо описать в разделе private:
class cl2 : public cl1 {
public:    
  int dgd;
private: //<------------------тут    
  void sll();
};

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 18.6.2013, 18:21
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(MishaUA @ 18.6.2013, 19:04) *
При компиляции ошибка mingw32-make[1]: *** [debug/classs.cpp] Error 1.
это не ошибка, это резюме - "ошибок столько-то штук"
смотри сообщения сборки выше - там описаны ошибки


если ориентироваться только на приведённый код, то он должен компилироваться без запинок в Qt4
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 18.6.2013, 20:14
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


Цитата(Steklova Olga @ 18.6.2013, 17:46) *
Сначала определись: sll() у тебя должен быть слотом или методом класса (как ты говоришь, функцией)?
Сейчас у тебя в коде указано, что sll() - это не просто функция, а слот.
А чтобы класс работал с сигналами и слотами, он должен быть потомком QObject.

Поэтому, если sll() действительно должен быть слотом, то в классе cl2 надо указать слово Q_OBJECT:
class cl2 : public cl1 {
  Q_OBJECT //<------------------тут
public:    
  int dgd;
private slots:    
  void sll();
};

sll() - это слот (сорри, что затупил).
Добавлять Q_OBJECT тоже пробовал, но тогда вылазит ошибка error: within this context (прям на Q_OBJECT) и 'class QObject QObject::QObject' is inaccessible

PS: пишу в Qt5
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 18.6.2013, 21:34
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


Капец, такие же ошибки даже в этом куске кода:
class cl1 : QObject {

};

class cl2 : public cl1 {
    Q_OBJECT
};

Может, надо копать в другом месте?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 18.6.2013, 22:02
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


попробуй просто полностью пересобрать проект
make distclean
qmake
make
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 18.6.2013, 22:16
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


А я это и делаю при сборке))
В Creater жму "пересобрать", ну и еще перед этим пробовал "Очистить" - не помогло.
Может ли кто нить у тебя в хидере всатвить этот код и попробовать?
PS: надо Qt5
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 18.6.2013, 22:19
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(MishaUA @ 19.6.2013, 0:16) *
А я это и делаю при сборке))В Creater жму "пересобрать"
нет, не то.
креатор при этом делает лишь make clean, вместо make distclean

можно в креаторе исправить команду "Очистка" в настройках проекта и указать distclean

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 18.6.2013, 22:35
Сообщение #10


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


Чего то я в настройках этого пункта не нашел))).
Я пробовал даже полностью удалять папку build-project-Desktop-Debug, в которой собирается программа, но безрезультатно(((

только что создал новый проект и закинул в хидер
class cl1 : QObject {

};
class cl2 : public cl1 {
    Q_OBJECT
};

Результат тот же(((((
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 1.12.2024, 21:47