2014-11-01 72 views
1

我試圖運行QTimer並讓它警告我時timeout ing。爲此,我使用slotsignal來鏈接這兩個。錯誤與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作爲th的第一個輸入e函數connect(),但文檔指定QTimer繼承自QObject。 我不知道這裏。

+1

信號和插槽只適用於QObject的子類,QGraphicsItem不是一個 – 2014-11-01 03:35:17

回答

2

您還需要從QObject繼承,才能使其工作,因爲可以爲QObject提供信號和插槽。 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 2014-11-01 03:59:04

+0

您可以嘗試'運行qmake'並在做出這些更改後重建項目 – 2014-11-01 06:27:31

+0

@wipman:您需要重新運行mocs,如果您運行qmake,則會自動發生。 – lpapp 2014-11-01 06:52:35

2

您可以繼承QGraphicsObject,它爲所有需要信號,插槽和繼承QGraphicsItemQObject的圖形項提供基類。還要在您的類聲明中添加Q_OBJECT宏。

+0

它的工作原理。謝謝。 – wipman 2014-11-02 13:42:39

1

如果使用新QT5風格連接在

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

onTimeOutTimer功能並不需要被標記爲插槽,Guy能熬非QObject的。涉及更少,更少的宏。

相關問題