Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 向类添加新功能_C++_Qt_Class_Overriding_Derived Class - Fatal编程技术网

C++ 向类添加新功能

C++ 向类添加新功能,c++,qt,class,overriding,derived-class,C++,Qt,Class,Overriding,Derived Class,我正在研究Qt4库,我想在我的项目中为QWidget的所有子项添加一些功能。我需要覆盖所有小部件的mousePressEvent。显然,我不需要在我使用的每个特定小部件中覆盖它(我使用了它们中的许多小部件,我希望它们遵循干式规则),而是创建一个Foo类: class Foo : public QWidget { Q_OBJECT protected: /* implementation is just a test */ virtual void

我正在研究Qt4库,我想在我的项目中为
QWidget
的所有子项添加一些功能。我需要覆盖所有小部件的
mousePressEvent
。显然,我不需要在我使用的每个特定小部件中覆盖它(我使用了它们中的许多小部件,我希望它们遵循干式规则),而是创建一个
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
{
    Q_OBJECT
protected:

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

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

};
并从中派生出我的按钮:

class FooButton : public QPushButton , public Foo
{

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

};
但这一事件似乎没有被推翻。。。我做错了什么?
提前感谢。

您现在从QWidget继承了两次。这是有问题的(参见)

相反,放下
Foo
类,将自定义鼠标按下事件处理程序移动到
FooButton
类:

class Foo : public QWidget
{
    Q_OBJECT
    protected:

        /* implementation is just a test */
        virtual void mousePressEvent(QMouseEvent*) { this->move(0,0);  }
};
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
如果这没有帮助,您应该按照其他答案的建议安装事件处理程序


(您可以在its中阅读有关虚拟继承的内容。)

您现在从QWidget继承了两次。这是有问题的(参见)

相反,放下
Foo
类,将自定义鼠标按下事件处理程序移动到
FooButton
类:

class Foo : public QWidget
{
    Q_OBJECT
    protected:

        /* implementation is just a test */
        virtual void mousePressEvent(QMouseEvent*) { this->move(0,0);  }
};
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
如果这没有帮助,您应该按照其他答案的建议安装事件处理程序


(您可以在its中阅读有关虚拟继承的内容。)

对于MousePresseEvent访问,请尝试QObject::installEventFilter()


对于MousePresseEvent访问,请尝试QObject::installEventFilter()


我怀疑问题在于您从
QWidget
继承了两次,一次通过
QPushButton
和一次通过Foo

从你对这个问题的措辞来看,我假设你想对各种各样的小部件这样做,因此不想对QPushButton、QLabel、QCheckBox等进行子类化。如果不是这样,那么你应该使用Nikos的答案

如果不是的话,你最好的选择可能是使用


我怀疑问题在于您两次继承了
QWidget
,一次通过
QPushButton
,一次通过Foo

从你对这个问题的措辞来看,我假设你想对各种各样的小部件这样做,因此不想对QPushButton、QLabel、QCheckBox等进行子类化。如果不是这样,那么你应该使用Nikos的答案

如果不是的话,你最好的选择可能是使用



我将需要删除它添加到我的项目中的所有类型的小部件。。。许多类型的小部件。。。。必须有另一种方法来解决这个问题…@Kolyunya尝试虚拟继承。我更新了答案。虚拟继承在这里不起作用,因为
QAbstractButton
实际上不从
QWidget
继承。我需要删除它以将其添加到项目中的所有类型的小部件中。。。许多类型的小部件。。。。必须有另一种方法来解决这个问题…@Kolyunya尝试虚拟继承。我更新了答案。虚拟继承在这里不起作用,因为
QAbstractButton
实际上不从
QWidget
继承。我在项目中有许多不同的小部件,所有的都必须覆盖此事件。我不认为在每个特定的类中复制事件的重新实现是一个好主意(DRY,你知道…)。我对事件过滤器一无所知,谢谢,我会了解的…我已经实现了你的建议。当我从一些小部件和Foo派生QWidget时,事件过滤器由于某种原因无法工作。。。任何想法…抱歉我犯了一点错误,福不应该继承任何东西。部分问题是您继承的两个类都是
QObject
s,这是不受支持的。感谢您的回复,但是
Foo
只有当它是
QObject
的子类时才会有
installEventFilter
,对吗?看来,这是个无法解决的问题。嗯。目前我能想到的最好办法就是将这一行代码添加到每个小部件中。不太理想,但至少它只是一行代码。我在项目中有许多不同的小部件,所有的小部件都必须覆盖此事件。我不认为在每个特定的类中复制事件的重新实现是一个好主意(DRY,你知道…)。我对事件过滤器一无所知,谢谢,我会了解的…我已经实现了你的建议。当我从一些小部件和Foo派生QWidget时,事件过滤器由于某种原因无法工作。。。任何想法…抱歉我犯了一点错误,福不应该继承任何东西。部分问题是您继承的两个类都是
QObject
s,这是不受支持的。感谢您的回复,但是
Foo
只有当它是
QObject
的子类时才会有
installEventFilter
,对吗?看来,这是个无法解决的问题。嗯。目前我能想到的最好办法就是将这一行代码添加到每个小部件中。不太理想,但至少只有一行代码。看起来你做错了!你不应该面对这个问题。为什么您需要更改所有小部件的行为?看起来您的smth做错了!你不应该面对这个问题。为什么需要更改所有小部件的行为?