Russian Qt Forum
Ноябрь 24, 2024, 14:58 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос по MOC компиляции  (Прочитано 6010 раз)
Mark_T
Гость
« : Октябрь 21, 2010, 18:44 »

Доброго всем времени суток! Я новичок в программировании, пишу проект который нужно будет сдать в задокументированном виде. Вопрос у меня следующий: про создании класса, к примеру Myclass, и определении в нем слотов и сигналов ( при включении макроса Q_OBJECT) и определении при этом методов класса не в заголовочном файле, а в myclass.cpp компилятор  ругается, что этот метод уже был определен в moc_myclass.cpp. Приходится определять метод в самом заголовочном файле, а в случае создания сигнала лезть в    moc_myclass.cpp комментить метод и перетаскивать директивы (не знаю как называются точно) в тело определения сигнала. Это конечно все работает, но уж очень некрасиво получается. Может достаточно прописать строчку в одном из файлов и проблема решиться. К примитивности изложения прошу не относиться строго. С проблемой бы разобрался, но через неделю сдавать листинги. Заранее спасибо...
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Октябрь 21, 2010, 18:52 »

А зачем переопределять сигнал??
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #2 : Октябрь 21, 2010, 19:59 »

Я ничего не понял  Смеющийся Зачем куда-то лезть, что-то переносить?

Вот пример класса:

.h файл
Код:
class MyClass : public QObject
{
Q_OBJECT

public:
   MyClass(QObject *parent = 0) : QObject(parent) { }
   void myMethod();

public slots:
   void mySlot();

signals:
  void mySignal();
}

.cpp файл
Код:
void MyClass::myMethod()
{
   //реализация
   //можно выслать наш сигнал
   emit mySIgnal();
}

void MyClass::mySlot()
{
  //реализация
}
« Последнее редактирование: Октябрь 21, 2010, 20:04 от kibsoft » Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
Mark_T
Гость
« Ответ #3 : Октябрь 21, 2010, 20:30 »

К примеру есть класс с файлом udpclientserver.h

class Udpclientserver: public QObject
{
Q_OBJECT
   public:
     Udpclientserver(QObject *parent = 0) : QObject(parent) { }
    
      
public slots:   
 void processDatagrams() {
      //реализация
      }

signals :
   void returndata () ;
                      };

теперь есть файл udpclientserver.cpp

void Udpclientserver::returndata()  {

             // реализация
          }

компилятор ( GNU) ругается, что функция returndata() уже определена в moc файле. За оформление прошу прощение ). В плане писать в форумы, я тоже новичок (
Записан
MoPDoBoPoT
Гость
« Ответ #4 : Октябрь 21, 2010, 21:02 »

 Шокированный
Тут явное непонимание принципов Qt. Надо книжку какую-нибудь по Qt прочитать.
Записан
BlackTass
Гость
« Ответ #5 : Октябрь 21, 2010, 21:24 »

Если перевести сообщения Павлика на общечеловеческий, то не надо писать тело сигнала. Правда очень интересно что же там можно написать? сигнал это по сути не метод, а некий маркер, служащий для абстракции онли.
Записан
Mark_T
Гость
« Ответ #6 : Октябрь 21, 2010, 21:52 »

Вопрос, может быть, еще более глупый. Если есть несколько объектов одного класса, у которого есть сигнал, и есть объект другого класса, у которого есть слот. Я хочу передать с помощью этого сигнала параметры этому объекту со слотом.  если нет реализации то как это сделать? По старинке у меня получалось, вроде
Записан
BlackTass
Гость
« Ответ #7 : Октябрь 21, 2010, 22:06 »

мммм, а можно все таки посмотреть что там в реализации сигнала у вас? уже стало очень интересно
Записан
Mark_T
Гость
« Ответ #8 : Октябрь 22, 2010, 07:19 »

Так, опишу тогда проблему, как есть. У меня есть класс (хотя и раньше при создании других классов я сталкивался с этой проблемой)
 
Код:
class Udpclientserver: public QObject 
{
Q_OBJECT
public:
           
           Udpclientserver(QObject *parent = 0){};
        ~Udpclientserver(){};

  //реализация
   
public slots:
 void processDatagrams() {
  //реализация
   emit returndata(str);
   
}
signals :
QString returndata (QString s) ;
                   
};


слоты кстати также приходится определять в заголовочном файле иначе так же ругается что эта  функция (слот) уже определена в файле  moc_udpclientserver.cpp. Но со слотами ладно, их как я понял можно и определать при объявлении, а вот сигнал приходится описывать в udpclientserver.cpp так
Код:
#include "udpclientserver.h" 
QString Udpclientserver::returndata(QString s}  {
return s;
}

то есть тут сигнал у меня служит и как маркер и как буфер для передачи данных между объектами. При компиляции (GNU make) выводится такое сообщение

Код:

moc_udpclientserver.o: In function `Udpclientserver::returndata(QString)':
moc_udpclientserver.cpp:(.text+0x20): multiple definition of `Udpclientserver::returndata(QString)'
udpclientserver.o:udpclientserver.cpp:(.text+0x0): first defined here
collect2: ld returned 1 exit status


Делаю следующее: открываю файл moc_udpclientserver.cpp и комментирую в нем

Код:

//QString Udpclientserver::returndata(QString _t1)
//{
  //  QString _t0;
  //  void *_a[] = { const_cast<void*>(reinterpret_cast<const void*>(&_t0)), const_cast<void*>(reinterpret_cast<const void*>(&_t1)) };
   // QMetaObject::activate(this, &staticMetaObject, 0, _a);
  //  return _t0;
//}


 копирую этот код в udpclientserver.cpp , чтобы было так :
Код:
QString Udpclientserver::returndata(QString _t1)  {

        QString _t0;
   void *_a[] = { const_cast<void*>(reinterpret_cast<const void*>(&_t0)), const_cast<void*>(reinterpret_cast<const void*>(&_t1)) };
QMetaObject::activate(this, &staticMetaObject, 0, _a);
  QString s=_t1;
  return s;
}


все работает. Проблема, конечно, решается таким способом, но как-то стыдно такое дело показывать ((.
Записан
BlackTass
Гость
« Ответ #9 : Октябрь 22, 2010, 09:37 »

Во-первых, сделайте сигналу возвращаемый тип void
Во-вторых, уберите тело сигнала совсем. Оставьте только строку void returndata(QString a);
В-третьих, почитайте уже ассистант на тему сигнал-слотов
Записан
Mark_T
Гость
« Ответ #10 : Октябрь 22, 2010, 12:06 »

Спасибо, вроде работает. Будем копать дальше
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 23.