2016-12-09 14 views
1

저는 여러 플러그인이 포함될 C++/Qt 프로그램을 개발 중입니다. 각 클래스에 대한 나는 다음과 같습니다 플러그인 인터페이스를 정의 할 필요가 그래서Q_OBJECT가 포함 된 C++ 매크로

#define MY_PLUGIN_BASE(__c_name,__appendix)         \ 
    class __c_name##__appendix : public QObject, myPlug {      \ 
    Q_OBJECT                 \ 
    Q_INTERFACES(nPanPlug)             \ 
    Q_PLUGIN_METADATA(IID "org.myapp.plug")         \ 
    public:                 \ 
     __c_name##__appendix() {qRegisterMetaType<__c_name *>(#__c_name"*");} \ 
     QByteArray name() {return #__c_name;}         \ 
    }; 

#define MY_PLUGIN(__c_name) MY_PLUGIN_BASE(__c_name,Plug) 

: 나는 매크로 (나는 C++ 전처리 전문가가 아니에요 이후 실제로 2)을 생성

//my class 
class qwerty; 

//my interface 
class qwertyPlug : public QObject, myPlug { 
Q_OBJECT 
Q_INTERFACES(nPanPlug) 
Q_PLUGIN_METADATA(IID "org.myapp.plug") 
public: 
    qwertyPlug() {qRegisterMetaType<qwerty *>("qwerty""*");} 
    QByteArray name() {return "qwerty";} 
}; 

그 난 그냥 추가해야합니다 ( qwerty가 정의) 내 코드에서 :

MY_PLUGIN(qwerty) 

(g++ -E의 출력)를 확장 할 :

class qwertyPlug : public QObject, myPlug { Q_OBJECT Q_INTERFACES(nPanPlug) Q_PLUGIN_METADATA(IID "org.myapp.plug") public: qwertyPlug() {qRegisterMetaType<qwerty *>("qwerty""*");} QByteArray name() {return "qwerty";} }; 

그것은 (가독성 미안하지만 난 .. 줄 바꿈을 추가하는 방법을 잘 모릅니다) 확인을보고 복사/내 코드에서 위의 라인을 붙여 넣기 만하면 작동 ...

내가 컴파일 내 프로젝트에서 오류가 발생합니다. moc :

Error: Class declaration lacks Q_OBJECT macro. 

누구나 아이디어가 있습니까?

+0

myPlug 란 무엇입니까? – Silicomancer

+0

이 플러그인 인터페이스인데, 하나의 thah는'instantiate'를 정의하고'Q_DECLARE_INTERFACE (myPlug, "org.myapp.plug")' – bibi

답변

0

@Silicomancer에서 제안한대로 그대로있을 수는 없습니다. 나에게

#define MY_PLUGIN_BASE(__c_name,__appendix) class __c_name##__appendix : public QObject, myPlug { Q_OBJECT Q_INTERFACES(nPanPlug) Q_PLUGIN_METADATA(IID "org.myapp.plug") public: __c_name##__appendix() {qRegisterMetaType<__c_name *>(#__c_name"*");} QByteArray name() {return #__c_name;} }; 

은 MOC처럼 보인다 Q_OBJECT하지만 아무튼 찾고 파일을 통해 진행됩니다

은 내가 proble가 멀티 라인 매크로이었고, 매크로가 한 줄 경우가 실제로 작동하는지 파악 매크로를 사용하지 마십시오

+1

처럼 보입니다. moc처럼 보일 수 있습니다. 아직도 당신이 그렇게해야하는지 확실하지 않습니다. 코드가 변경되면 언제든지 다시 작동하지 않을 수 있습니다. 매크로 접근법을 떨어 뜨리거나 자신 만의 전처리 방법을 찾아보십시오. – Silicomancer