Я изучаю библиотеку 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) { };
};
Но событие, похоже, не отменено … Что я делаю не так?
Заранее спасибо.
Вы дважды наследуете от 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
Если это не поможет, следуйте советам других ответов и установите обработчик событий.
(Вы можете прочитать о виртуальном наследовании в его Статья в википедии.)
Для доступа mousePressEvent попробуйте QObject :: installEventFilter ().
Я подозреваю, что проблема в том, что вы наследуете от 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) );
}
};