Добавление новой функциональности в класс

Я изучаю библиотеку 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 , public Foo
{

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

};

Но событие, похоже, не отменено … Что я делаю не так?
Заранее спасибо.

0

Решение

Вы дважды наследуете от 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

Если это не поможет, следуйте советам других ответов и установите обработчик событий.

(Вы можете прочитать о виртуальном наследовании в его Статья в википедии.)

1

Другие решения

Для доступа mousePressEvent попробуйте QObject :: installEventFilter ().

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

2

Я подозреваю, что проблема в том, что вы наследуете от QWidget дважды, один раз через QPushButton и однажды через Foo.

Исходя из того, как вы сформулировали вопрос, я предполагаю, что вы хотите сделать это для различных видов виджетов, и, следовательно, не хотите иметь подкласс 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) );
}
};
1
По вопросам рекламы [email protected]