2014-11-01 9 views
1

Я пытаюсь запустить QTimer и предупредил меня, когда timeout ing. Для этого я использую slot и signal, чтобы связать их.Ошибка с QObject :: connect()

guy.h:

#ifndef GUY_H 
#define GUY_H 

#include <QGraphicsItem> 
#include <QTimer> 
#include <QObject> 

class Guy : public QGraphicsItem 
{ 
public: 
    Guy(int x, int y); 

    void timerStart(); 

public slots: 
    void onTimeOutTimer(); 

    [...] 

    QTimer *timer; 
} 

#endif // GUY_H 

guy.cpp:

#include "guy.h" 

#include <QTimer> 
#include <QObject> 

#include <stdio.h> 
#include <iostream> 

Guy::Guy(int x, int y) 
{ 
    timer = new QTimer(); 
} 

void Guy::timerStart() 
{ 
    QObject::connect(timer, SIGNAL(timeout()), this, SLOT(onTimeOutTimer())); 
    this->timer->setInterval(1000); 
    this->timer->start(); 
    std::cout << "starting timer" << std::endl; 
} 

void Guy::onTimeOutTimer() 
{ 
    std::cout << "check" << std::endl; 
} 

Но как поток вывода, я получаю эту ошибку:

No matching function for call to 'QObject::connect(QTimer*&, const char*, Guy* const, const char*)' 

Как я undertsand это не то, что QTimer нет QObject требуется в качестве первого ввода e function connect(), но в документации указаны QTimer наследуется от QObject. У меня нет подсказки.

+1

Сигнал и слоты работают только с подклассами QObject, QGraphicsItem не является одним –

ответ

2

Вам нужно будет унаследовать от QObject, чтобы это работало, поскольку сигналы и слоты доступны для QObjects. QGraphicsItem не наследует QObject, даже косвенно.

Мало того, что вам необходимо будет также добавить Q_OBJECT макрос следующим образом:

class Guy : public QObject, public QGraphicsItem 
{ 
    Q_OBJECT 
    ... 
} 

или даже лучше, потому что QGraphicsObject наследует QObject и QGraphicsItem.

... 
#include <QGraphicsObject> 
... 

class Guy : public QGraphicsQObject 
{ 
    Q_OBJECT 
    ... 
} 

Кроме того, если вы сделаете это изменение, я предлагаю изменить QObject::connect к connect как вам не нужно указывать QObject:: объем пор.

На боковой ноте, в том числе stdio.h, похоже, не имеет смысла здесь.

Кроме того, выделение экземпляра QTimer в куче выглядит расточительным для меня. Это не только утечка памяти, но и добавляет дополнительную сложность. Даже если вы выделите его в кучу, вы должны передать это как родительский элемент и использовать инициализацию или инициализацию стиля C++ 11. Кроме того, если вы разместите его в куче, вы можете использовать форвардное объявление в заголовке.

Если слот не используется вне класса, вы также должны сделать это частным.

Возможно, это также плохая идея, чтобы сделать пользователя таймера общедоступным. Надеюсь, вы этого не сделаете.

+0

Спасибо. Но, наследуя 'QObject', я получаю те:' staticMeaObject не является членом QGraphicsItem', 'qt_metacast не является членом QGraphicsItem', а' qt_metacall не является членом QGraphicsItem'. Он идет глубоко. – wipman

+0

Вы можете попробовать «запустить qmake» и перестроить свой проект после внесения этих изменений. –

+0

@wipman: вам нужно перезапустить mocs, что происходит автоматически, если вы запустите qmake. – lpapp

2

Вы можете наследовать от QGraphicsObject, который предоставляет базовый класс для всех графических элементов, которым требуются сигналы, слоты и наследования QGraphicsItem и QObject. Также добавьте макрос Q_OBJECT в объявление класса.

+0

Он работал. Благодарю. – wipman

1

Если вы используете новый стиль Qt5 соединяет как в

QObject::connect(timer, &QTimer::timeout, this, &Guy::onTimeOutTimer) 

onTimeOutTimer функция не должна быть помечена как слот, и Guy может оставаться не-QObject. Гораздо меньше и меньше макросов.

 Смежные вопросы

  • Нет связанных вопросов^_^