0

Qt4ライブラリを勉強していて、プロジェクトのすべての子にQWidgetいくつかの機能を追加したいと思います。すべてのウィジェットをmousePressEventオーバーライドする必要があります。明らかに、私が使用するすべての特定のウィジェットでそれをオーバーライドする必要はありません(私はそれらの多くFooを使用し、DRYルールに従います)、代わりにクラスを作成します:

class Foo : public QWidget
{
    Q_OBJECT
    protected:

        /* implementation is just a test */
        virtual void mousePressEvent(QMouseEvent*) { this->move(0,0);  }
};

そしてそれから私のボタンを導き出します:

class FooButton : public QPushButton , public Foo
{

    public:
        FooButton (QWidget* parent) : QPushButton(parent) { };

};

しかし、イベントはオーバーライドされていないようです...私は何が間違っているのですか?前もって感謝します。

4

3 に答える 3

2

mousePressEvent アクセスについては、QObject::installEventFilter() を試してください。

http://doc.qt.digia.com/stable/qobject.html

于 2012-10-26T21:00:14.053 に答える
1

QWidget から 2 回継承しています。これには問題があります (ダイヤモンドの問題を参照)。

代わりに、クラスをドロップしてFoo、カスタム マウス プレス イベント ハンドラーをクラスに移動しますFooButton

class FooButton : public QPushButton
{
    Q_OBJECT
protected:

    /* implementation is just a test */
    virtual void mousePressEvent(QMouseEvent*) { this->move(0,0);  }

public:
    FooButton (QWidget* parent) : QPushButton(parent) { };

};

これがアプリケーションの設計に合わない場合は、代わりに仮想継承を使用してみてください。つまり、次のように変更Fooします。

class Foo : public virtual QWidget

それでも解決しない場合は、他の回答のアドバイスに従って、イベント ハンドラーをインストールする必要があります。

(ウィキペディアの記事で仮想継承について読むことができます。)

于 2012-10-26T20:53:34.570 に答える
1

問題は、Foo を 1 回と 1QWidget回、2 回継承していることだと思います。QPushButton

質問の言い回しから、さまざまな種類のウィジェットに対してこれを実行したいので、QPushButton、QLabel、QCheckBoxなどをサブクラス化する必要はないと思います。そうでない場合は、ニコスの答えを使用する必要があります。

そうでない場合は、おそらくイベント フィルターを使用することをお勧めします。

class MousePressFilter : public QObject {
Q_OBJECT
    public:
        MousePressFilter(QObject *parent) : QObject(parent) { }

    protected:
        bool eventFilter(QObject *watched, QEvent *event) {
            QWidget *widget = dynamic_cast<QWidget*>(watched);
            widget->move(0,0);
            return false;
        }
};

そして、Foo クラスのコンストラクターで次のようにします。

class Foo {
    Foo() {
        installEventFilter( new MousePressFilter(this) );
    }
};
于 2012-10-26T21:01:40.690 に答える