2014-06-17 1 views
0

위젯과 연결 슬롯에서 상속에 관한 몇 가지 문제점이 있습니다. QWidget에서 상속받은 추상 위젯을 만들었습니다. 여기에 프로토 타입은 다음과 같습니다 자식 위젯 슬롯에 신호를 연결하십시오.

class WidgetParams : public QWidget 
{ 
    Q_OBJECT 
public: 
    explicit WidgetParams(QWidget *parent = 0) : QWidget(parent){} 
    virtual bool paramChanged() = 0; 
protected: 
     bool paramsChanged; 
}; 

은 그럼 예를 WidgetParamsWindows를 들어, WidgetParams에서 유래 된 클래스를 만들었 :

class WidgetParamsWindows : public WidgetParams 
{ 
    public: 
    explicit WidgetParamsWindows(QWidget *parent = 0); 
    virtual bool paramChanged(){return paramsChanged;} 
    private: 
    QFormLayout *layout; 
    QSpinBox *svertical; 
    QSpinBox *shorizontal; 
    signals: 

    public slots: 
    void changeSomeParam(int value); 
}; 

WidgetParamsWindows에서, 나는 약간 QSpinBox, QPushButton 등이 PARAMS을 조정해야합니다.

내가 같이 WidetParamsWindowsQSpinBox를 연결 : 올바른 WidgetParams을 보여주기 위해, 그 후

connect(spinbox,SIGNAL(valueChanged(int)),this,SLOT(changeSomeParam(int)); 

가 나는 WidgetParamsWindows을 작성 WidgetParams 목록에 넣을 때의 사용자를 클릭합니다.

하지만 난 QSpinBox, 아무것도 변화 값을 변경하려고 나는 콘솔에 다음과 같은 메시지가있을 때, 대신

QObject::connect: No such slot WidgetParams::changeSomeParam(int) 

부모 위젯 슬롯을 왜 모르겠어요 WidgetParamsWindows, 아이디어가 있으십니까?

+4

WidgetParamsWindowQ_OBJECT를 추가하려고, 슬롯 매크로가 해결되지 않는, WidgetParamsWindow에는 Q_OBJECT 매크로가 없다? 'WidgetParamsWindows'에도'Q_OBJECT' 매크로를 추가 했습니까? 'changeSomeParam (int) '슬롯은 어디에서 선언 되었습니까? –

답변

5

그래서 moc 당신이 좀 더 코드 (특히 클래스 정의를) 공유 할 수

+0

고마워요 그것의 작품 그것은 Q_OBJECT 매크로없이 유일한했지만 지금은 컴파일에 '정의되지 않은 vtable'의 문제가 있습니다. Q_OBJECT는 작동하기 위해 선언을 추가해야합니까? 나는이 매크로와 컴파일 작업을 잊지 않는 다른 WidgetParams를 가지고 있는지 확인한다. – user3627590

+0

@ user3627590, 프로젝트를 컴파일하기 전에 qmake를 실행 했습니까? – vahancho

+0

정의되지 않은 vtable은 가상 함수 및 다형성에 문제가 있습니다. WidgetParams를 상속 한 모든 클래스에서 paramChanged()를 선언하고 있습니까? – Maciej