0

我正在研究 Qt4 库,我想为我项目中的所有子项添加一些功能。QWidget我需要mousePressEvent覆盖所有小部件。显然,我不需要在我使用的每个特定小部件中覆盖它(我使用了许多小部件,并且我遵循 DRY 规则),而是创建了一个Foo类:

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 继承了两次。这是有问题的(参见钻石问题)。

相反,删除您的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

如果这没有帮助,您应该遵循其他答案的建议并安装事件处理程序。

(您可以在其Wikipedia 文章中阅读有关虚拟继承的信息。)

于 2012-10-26T20:53:34.570 回答
1

我怀疑问题是你从QWidget两次继承,一次通过QPushButton,一次通过 Foo。

从你提出问题的方式来看,我假设你想对不同类型的小部件执行此操作,因此不希望将 QPushButton、QLabel、QCheckBox 等子类化。如果不是这种情况,那么你应该使用 Nikos 的答案。

如果没有,您最好的选择可能是使用事件过滤器

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 回答