Название: Переопределенные события для класса и новый виджет Отправлено: Hellrider от Январь 03, 2013, 15:41 Пример класса
Код: class Test : public QLabel{ Название: Re: Переопределенные события для класса и новый виджет Отправлено: Old от Январь 03, 2013, 15:50 Если я правильно тебя понял, то в переопределенных методах нужно вызывать их парент-реализации.
Код
Название: Re: Переопределенные события для класса и но& Отправлено: Hellrider от Январь 03, 2013, 16:09 Если я правильно тебя понял, то в переопределенных методах нужно вызывать их парент-реализации. Ну QLabel добавлять не нужно, он и так работает, а вот виджет wgt не взаимодействует с этими событиями. Пробовал добавить QWidget::mousePressEvent(pe); не помогло.Код
Название: Re: Переопределенные события для класса и новый виджет Отправлено: Old от Январь 03, 2013, 16:19 Напиши, что хочешь сделать. Потому, что не понятно, как этот виджет должен взаимодействовать и с чем.
Название: Re: Переопределенные события для класса и но& Отправлено: Hellrider от Январь 03, 2013, 16:27 Напиши, что хочешь сделать. Потому, что не понятно, как этот виджет должен взаимодействовать и с чем. Мне нужно, чтобы виджет wgt таким же способом перемещался мышкой, как главный виджет в классе, который использует переопределенные события мыши.Название: Re: Переопределенные события для класса и новый виджет Отправлено: Dancing_on_water от Январь 03, 2013, 16:44 тогда тебе нужно в конструторе:
Код: wgt.setParent(this); Название: Re: Переопределенные события для класса и новый виджет Отправлено: Hellrider от Январь 03, 2013, 16:56 тогда тебе нужно в конструторе: wgt.setParent(this); засовывает wgt в главный виджет. wgt идет отдельным окном.Код: wgt.setParent(this); Название: Re: Переопределенные события для класса и новый виджет Отправлено: Old от Январь 03, 2013, 16:58 wgt идет отдельным окном. Тогда, делай отдельный класс-наследник QWidget и переопределяй обработчики событий мыши. Ну и используй го в классе Test.Название: Re: Переопределенные события для класса и новый виджет Отправлено: Dancing_on_water от Январь 03, 2013, 17:03 wgt.setParent(this); засовывает wgt в главный виджет. wgt идет отдельным окном. А теперь все сначала. Давай обрисовывай ситуацию целиком, иначе все советы - это пальцем в небо. Нужно что есть, что хотим и какие проблемы.Название: Re: Переопределенные события для класса и новый виджет Отправлено: kambala от Январь 03, 2013, 17:25 насколько я понял, автор хочет, чтобы реализация событий «принадлежала» как унаследованному лейблу, так и виджету, содержащемуся в нем. должно подойти множественное наследование, только придется хранить указатели на методы move() и slotStart().
Название: Re: Переопределенные события для класса и новый виджет Отправлено: Hellrider от Январь 03, 2013, 17:26 wgt.setParent(this); засовывает wgt в главный виджет. wgt идет отдельным окном. А теперь все сначала. Давай обрисовывай ситуацию целиком, иначе все советы - это пальцем в небо. Нужно что есть, что хотим и какие проблемы.Код: class Timer : public QLabel В главном виджете через кнопку вызывается слот, который отображает виджет в отдельном окне wh.show(). В отдельное окно я тоже хочу поставить флаг Qt::FramelessWindowHint, но wh виджет не взаимодействует с событиями, которые в классе. Мне нужно както переопределить события мыши для wh виджета или связать этот виджет с событиями в классе. Название: Re: Переопределенные события для класса и новый виджет Отправлено: Hellrider от Январь 03, 2013, 17:28 насколько я понял, автор хочет, чтобы реализация событий «принадлежала» как унаследованному лейблу, так и виджету, содержащемуся в нем. должно подойти множественное наследование, только придется хранить указатели на методы move() и slotStart(). Так точно. Можно пример, как это правильно реализовать? Название: Re: Переопределенные события для класса и новый виджет Отправлено: kambala от Январь 03, 2013, 18:30 думал как-то так можно сделать, но не получается добраться до реального виджета в mouseMoveEvent (reinterpret_cast тоже не помогает):
Код
Название: Re: Переопределенные события для класса и новый виджет Отправлено: Old от Январь 03, 2013, 19:01 думал как-то так можно сделать, но не получается добраться до реального виджета в mouseMoveEvent (reinterpret_cast тоже не помогает): Его можно передавать в качестве параметра.А для нормального переопределения метод A::self хорошо бы сделать виртуальным. Название: Re: Переопределенные события для класса и новый виджет Отправлено: kambala от Январь 03, 2013, 20:47 Его можно передавать в качестве параметра. тоже об этом подумал потомА для нормального переопределения метод A::self хорошо бы сделать виртуальным. согласенНазвание: Re: Переопределенные события для класса и новый виджет Отправлено: Igors от Январь 04, 2013, 09:51 Не понял чем не устраивает самый обычный parent/child? Конечно указатель на wh, а не член данных. Методы надо переопределить для обоих классов. wh получит событие, возможно сам его отработает или сочтет нужным вызвать метод парента (пересчитав позицию мыши)
Название: Re: Переопределенные события для класса и но& Отправлено: Hellrider от Январь 04, 2013, 14:30 думал как-то так можно сделать, но не получается добраться до реального виджета в mouseMoveEvent (reinterpret_cast тоже не помогает): Я немного не пойму как работает self() разжуйте по полочкам пожалуйста =). Определил virtual QWidget* self(){return 0;} и все заработало. Хочу понять до конца, как это все работает. Еще есть проблема этим событием, которое уже в Timer классе, оно срабатывает при нажатии любой кнопки, хотя должно только от ентер ???Код
Код: void keyPressEvent(QKeyEvent* pe){ Название: Re: Переопределенные события для класса и новый виджет Отправлено: kambala от Январь 04, 2013, 16:34 self() возвращает указатель на «реальный» экземпляр класса, который наследуется от QWidget. это нужно потому, что класс A не наследуется от QWidget, и потому просто this там не прокатит. вот если бы все вызовы методов разрешались в рантайме (как например в Objective-C), то такое не нужно было бы :)
про кнопку — там наверное надо условие pe->key() == Qt::Key_Enter || pe->key() == Qt::Key_Return (Qt::Key_Return — это как раз то, что принято называть энтером, а Qt::Key_Enter — это энтер на нампаде) Не понял чем не устраивает самый обычный parent/child? кастомные события же всё равно не будут работать, будь виджет хоть ребенком. к тому же, виджет является отдельным окном, что не особо вяжется с parent/child как по мне.Название: Re: Переопределенные события для класса и новый виджет Отправлено: Igors от Январь 04, 2013, 18:19 кастомные события же всё равно не будут работать, будь виджет хоть ребенком. к тому же, виджет является отдельным окном, что не особо вяжется с parent/child как по мне. Ну я полагал что точка где случился mouseDown покрывается обоими виджетами - иначе зачем городить такую реакцию на мышь? Ладно, пусть даже 2 окна. Так или иначе дело сводится к делегированию - и только то что делегировано будет работать. Привлекать множественное наследование не ошибка, но, как часто бывает, простое членство не хуже Название: Re: Переопределенные события для класса и новый виджет Отправлено: Hellrider от Январь 04, 2013, 18:45 кастомные события же всё равно не будут работать, будь виджет хоть ребенком. к тому же, виджет является отдельным окном, что не особо вяжется с parent/child как по мне. Ну я полагал что точка где случился mouseDown покрывается обоими виджетами - иначе зачем городить такую реакцию на мышь? Ладно, пусть даже 2 окна. Так или иначе дело сводится к делегированию - и только то что делегировано будет работать. Привлекать множественное наследование не ошибка, но, как часто бывает, простое членство не хуже Можно пример реализации? Я с делегатами еще толком не сталкивался Название: Re: Переопределенные события для класса и новый виджет Отправлено: Igors от Январь 04, 2013, 19:14 Можно пример реализации? Я с делегатами еще толком не сталкивался Здесь "делегат" - в смысле паттерн программирования. Напр такКод Остальное в том же духе, без класса A. Можно и наоборот, Widget::mousePressEvent вызывает Timer::mousePressEvent. Можно и оба вместе, только пресечь рекурсию. Разницы по существу никакой, kambala просто обобщил этот механизм Название: Re: Переопределенные события для класса и новый виджет Отправлено: kambala от Январь 04, 2013, 19:19 Hellrider хочет, чтобы и у Timer и у Widget реализация указанных событий была одинаковая, потому я и пошел через множественное наследование.
|