0

私は Qt フレームワークのために書いていて、QWidget を作成したいと考えています。QWidget は、mousePressEvent や mouseReleaseEvent などのいくつかのインターフェイスを公開します。このクラスを拡張して、mouseClickEvent と mouseDoubleClickEvent を許可したいと考えています。通常、QWidget を拡張してそれらの機能を実装することを考えるでしょう。問題は、QWidget を拡張するライブラリの一部として提供される他のクラス (QPushButton など) があることです。したがって、各クラスを拡張してコードをコピーすることなく、これらのクラスに追加された機能を取得するにはどうすればよいでしょうか?


class ClickHandeler : public QWidget {
    virtual void mouseClickEvent();
    virtual void mouseDoubleClickEvent();

    int clickCount; //initialized to 0;

    void mouseReleaseEvent(QEvent *event){
        clickCount++;
        QTimer::singleShot(500, this, SLOT(checkClick()));
    }

    void checkClick(){
        if (clickCount == 2){
            this->mouseDoubleClickEvent();
            clickCount = clickCount-2;
        } else {
            this->mouseDoubleEvent()
            clickCount--;
        }
    }
}

// QPushButton inherits QWidget too! Yikes!
class MyPushButton : public QPushButton, public ClickHandeler {
    void mouseClickEvent(){
        alert("i have been clicked");
    }

    void mouseDoubleClickEvent(){
        alert("i have been double clicked");
    }
}

MyPushButton のようなものが欲しいのですが、関数のオーバーライドが期待どおりに機能しないことが心配です。

この質問が人々にとって明らかである場合は申し訳ありませんが、用語が何であるかわかりません。C ++のインターフェイスをグーグルで検索しましたが、抽象インターフェイスを取得しました(これではこの問題が適切に解決されません)。私が愚かで、Google のより良い用語を知る必要がある場合は、コメントでお知らせください。質問を削除します。

4

1 に答える 1

0

QWidget を拡張して QWidget と同じ関数を呼び出すだけでよいと思います。例えば:

class QWidget {
public:
    void mouseClickEvent();
};

class QPushButton {
public:
    void mouseClickEvent();
};

class MyWidget : public QWidget, public QPushButton {
public:
    void mouseClickEvent()
    {
        //base::mouseClickEvent();// ambiguous
        QWidget::mouseClickEvent();
        QPushButton::mouseClickEvent();
        /* Do your own code here */
    }
};
于 2013-02-28T23:57:44.907 に答える