2014-06-17 34 views
0

我在插件和連接插槽中存在一些繼承問題。我創建了一個從QWidget繼承的抽象Widget。這裏是原型:在子插件插槽上連接信號

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

然後創建衍生化類從WidgetParams,例如WidgetParamsWindows

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,我有一些QSpinBoxQPushButton等來調整PARAMS。

WidetParamsWindows連接QSpinBox這樣的:

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

之後,我創建了一個WidgetParamsWindows,並把它在WidgetParams列表,以顯示正確的WidgetParams當它的用戶點擊。

但是,當我試圖在QSpinBox,沒有什麼變化改變價值,我在控制檯以下消息:

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

我不知道爲什麼父窗口部件採取插槽,而不是WidgetParamsWindows, 你有什麼想法嗎?

+4

添加Q_OBJECT你能分享更多的代碼(尤其是類定義)?您是否也將'Q_OBJECT'宏添加到'WidgetParamsWindows'?聲明'changeSomeParam(int)'槽的位置在哪裏? –

回答

5

有一個在WidgetParamsWindow沒有Q_OBJECT宏,所以moc不能解決插槽宏,嘗試在WidgetParamsWindow

+0

謝謝它的作品它是唯一沒有Q_OBJECT的宏,但是現在我在編譯時遇到了'undefined vtable'的問題。 Q_OBJECT必須添加一些聲明才能工作?我檢查了其他WidgetParams,我不會忘記這個宏和他們的編譯工作。 – user3627590

+0

@ user3627590,您是否在編譯該項目之前運行qmake? – vahancho

+0

未定義的vtable是虛函數和多態性的問題。你是否在所有繼承自WidgetParams的類中聲明paramChanged()? – Maciej