C++ 向类添加新功能
我正在研究Qt4库,我想在我的项目中为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
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做错了!你不应该面对这个问题。为什么需要更改所有小部件的行为?