2011-10-26 9 views
3

내 프로그램이 포커스를 잃었을 때 타이머를 멈추고 시작하는 간단한 클래스가 있습니다. 그러나 QObject는 모든 신호 슬롯 연결에서 MyApp의 모호한베이스입니다. 여기QObject 상속 애매한베이스

class MyApp : public QApplication, public QObject 
{ 
    Q_OBJECT 
    ... 
} 

내 (지저분한)하여 Main.cpp입니다 : 다음은 관련 코드입니다

#include <QtGui/QApplication> 
    #include "qmlapplicationviewer.h" 
    #include <QObject> 
    #include <QGraphicsObject> 
    #include <QTimer> 
    #include <QVariant> 
    #include "timecontrol.h" 
    #include "scorecontrol.h" 
    #include "Retry.h" 
    #include <QEvent> 
    #include "myapp.h" 

    int main(int argc, char *argv[]) 
    { 
     MyApp app(argc, argv); 

     QmlApplicationViewer viewer; 
     viewer.setOrientation(QmlApplicationViewer::ScreenOrientationLockLandscape); 
     viewer.setMainQmlFile(QLatin1String("qml/Raker/main.qml")); 
     viewer.showExpanded(); 

     QObject *rootObject = viewer.rootObject(); 

     QTimer *timmer = new QTimer; 
     timmer->setInterval(1000); 

     TimeControl *timcon = new TimeControl; 

     scorecontrol *scorer = new scorecontrol; 

     Retry *probeer = new Retry; 

     QObject::connect(timmer, SIGNAL(timeout()), timcon, SLOT(updateTime())); 
     QObject::connect(timcon, SIGNAL(setTime(QVariant)), rootObject, SLOT(setTime(QVariant))); 
     QObject::connect(rootObject, SIGNAL(blockClicked(int, int)), scorer, SLOT(checkRight(int, int))); 
     QObject::connect(scorer, SIGNAL(setScore(QVariant)), rootObject, SLOT(setScore(QVariant))); 
     QObject::connect(scorer, SIGNAL(setState(QVariant)), rootObject, SLOT(setState(QVariant))); 

     QObject::connect(rootObject, SIGNAL(start()), probeer, SLOT(Reetry())); 
     QObject::connect(probeer, SIGNAL(start()), timmer, SLOT(start())); 
     QObject::connect(probeer, SIGNAL(stop()), timmer, SLOT(stop())); 
     QObject::connect(probeer, SIGNAL(start(int)), scorer, SLOT(randomNum(int))); 
     QObject::connect(probeer, SIGNAL(sReset()), timcon, SLOT(reset())); 
     QObject::connect(probeer, SIGNAL(tReset()), scorer, SLOT(reset())); 
     QObject::connect(timcon, SIGNAL(timeOut()), scorer, SLOT(reset())); 

     QObject::connect(timcon, SIGNAL(setState(QVariant)), rootObject, SLOT(setState(QVariant))); 
     QObject::connect(timcon, SIGNAL(changeFinal()), scorer, SLOT(changeFinal())); 
     QObject::connect(scorer, SIGNAL(setFinal(QVariant)), rootObject, SLOT(setFinal(QVariant))); 

     QObject::connect(&app, SIGNAL(focusL()), probeer, SLOT(focusL())); 
     QObject::connect(&app, SIGNAL(focusG()), probeer, SLOT(focusG())); 

     return app.exec(); 
    } 

MyApp.cpp :

#include "myapp.h" 
    #include <QDebug> 
    #include <QObject> 

    MyApp::MyApp(int argc, char **argv): QApplication(argc, argv) 
    { 
     installEventFilter(this); 
    } 

    bool MyApp::eventFilter(QObject *object, QEvent *event) 
    { 
     if (event->type() == QEvent::ApplicationDeactivate) 
     { 
      qDebug() << "Focus lost"; 
      focusL(); 
     } 
     if (event->type() == QEvent::ApplicationActivate) 
     { 
      qDebug() << "Focus gained"; 
      focusG(); 
     } 

     return false; 
    } 

답변

9

현재 예제에서는 객체가 QObject의 이중 인스턴스로 끝나는 분할 상속 체계를 만들었습니다 ... QApplication에 대해 하나의베이스 QObject이 있고 실제 MyApp 클래스에 대해 하나의베이스가 있습니다. 상속 된 기본 객체에 액세스 할 것인지 정확히 알 수 없으므로 상속 된 QObject 메서드에 액세스 한 이후로 모호성이 발생합니다.

이 (당신의 MyApp 개체가 상속 QObject를의 두 인스턴스주의)처럼

는 지금, 당신의 상속 다이어그램 같습니다

| QObject |   | QObject | 
     \    /
     \   | QApplication | 
     \   /
      \   /
     | MyApp | 

당신은, 당신의 상속 다이어그램 선형을 유지하기보다는 분할 상속 계획을 가지고 있어야하고 이는 기본 클래스의 하나의 인스턴스 만 포함하는 파생 클래스가 있음을 의미합니다. 그래서 당신은 다음과 같이합니다 :

QObject 
     | 
     | 
    QApplication 
     | 
     | 
    MyApp 
+0

이제 Q_OBJECT 매크로 위의 "{"및 "MyApp 발생 두 줄"의 MyApp.cpp에서이 줄에 'vtable for MyApp'에 대한 정의되지 않은 참조가 나타납니다. : "MyApp :: MyApp (int argc, char ** argv) : QApplication (argc, argv)" – Gerharddc

+1

'main()'은 어떻게 생겼는가? ... Laurent가 프로젝트에서'qmake'를 먼저 실행하는 것에 대한 의견도 두 번째로 줄 것입니다. – Jason

+0

내 메인을 내 qeustion에 추가했습니다 – Gerharddc

4

QApplication 당신, 그래서 이미 QObject입니다 간단히 작성해야합니다 :

class MyApp : public QApplication 
{ 
    Q_OBJECT 
... 

} 
+0

좋아,하지만 지금은이 라인에 MyApp를 모두 발행 수의 "{"는 Q_OBJECT 매크로 위, 그리고 MyApp.cpp에서의 'MyApp를위한 vtable에'에 대한 정의되지 않은 참조를 얻을 : "MyApp :: MyApp (int argc, char ** argv) : QApplication (argc, argv)" – Gerharddc

+2

먼저 프로젝트에서 qmake를 실행 했습니까? –

+0

Qt Creator를 사용하고 있으며 자동으로 수행하는 것처럼 보입니다. – Gerharddc