Russian Qt Forum
Ноябрь 12, 2024, 09:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Переопределенные события для класса и новый виджет  (Прочитано 12004 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #15 : Январь 04, 2013, 09:51 »

Не понял чем не устраивает самый обычный parent/child? Конечно указатель на wh, а не член данных. Методы надо переопределить для обоих классов. wh получит событие, возможно сам его отработает или сочтет нужным вызвать метод парента (пересчитав позицию мыши)
Записан
Hellrider
Гость
« Ответ #16 : Январь 04, 2013, 14:30 »

думал как-то так можно сделать, но не получается добраться до реального виджета в mouseMoveEvent (reinterpret_cast тоже не помогает):
Код
C++ (Qt)
class A
{
public:
   A() {}
 
protected:
   void mousePressEvent(QMouseEvent* pe)
   {
       qDebug() << Q_FUNC_INFO << "\n";
       if (pe->button() & Qt::LeftButton)
           point = pe->pos();
   }
 
   void mouseMoveEvent(QMouseEvent* pe)
   {
       qDebug() << Q_FUNC_INFO << "\n";
       QWidget *w = self();
       w->move(pe->globalPos() - point);
   }
 
   void keyPressEvent(QKeyEvent* pe)
   {
       if(pe->key() & Qt::Key_Enter)
       {
           start();
       }
   }
 
   void start() { qDebug() << Q_FUNC_INFO << "\n"; }
   QWidget *self() { return 0; }
 
private:
   QPoint point;
};
 
class Widget : public QWidget, public A
{
   Q_OBJECT
public:
   Widget(QWidget *parent = 0) : QWidget(parent), A()
   {
 
   }
 
protected:
   void mousePressEvent(QMouseEvent* pe) { qDebug() << Q_FUNC_INFO; A::mousePressEvent(pe); }
   void mouseMoveEvent(QMouseEvent* pe) { qDebug() << Q_FUNC_INFO; A::mouseMoveEvent(pe); }
   void keyPressEvent(QKeyEvent* pe) { qDebug() << Q_FUNC_INFO; A::keyPressEvent(pe); }
 
   QWidget *self() { return this; }
 
private slots:
   void slotStart() { start(); }
};
 
class Timer : public QLabel, public A
{
   Q_OBJECT
private:
   Widget *wh;
 
private slots:
   void slotStart() { start(); }
 
protected:
   void mousePressEvent(QMouseEvent* pe) { qDebug() << Q_FUNC_INFO; A::mousePressEvent(pe); }
   void mouseMoveEvent(QMouseEvent* pe) { qDebug() << Q_FUNC_INFO; A::mouseMoveEvent(pe); }
   void keyPressEvent(QKeyEvent* pe) { qDebug() << Q_FUNC_INFO; A::keyPressEvent(pe); }
 
   QWidget *self() { return this; }
 
public:
   Timer(QWidget *parent = 0) : QLabel("label", parent), A), wh(new Widget)
   {
       wh->show();
   }
};
Я немного не пойму как работает self() разжуйте по полочкам пожалуйста =). Определил virtual QWidget* self(){return 0;} и все заработало. Хочу понять до конца, как это все работает. Еще есть проблема этим событием, которое уже в Timer классе, оно срабатывает при нажатии любой кнопки, хотя должно только от ентер  Непонимающий
Код:
void keyPressEvent(QKeyEvent* pe){
        if(pe->key() & Qt::Key_Enter){
            slotStart();
        }
            }
« Последнее редактирование: Январь 04, 2013, 16:02 от Hellrider » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4746



Просмотр профиля WWW
« Ответ #17 : Январь 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 как по мне.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Январь 04, 2013, 18:19 »

кастомные события же всё равно не будут работать, будь виджет хоть ребенком. к тому же, виджет является отдельным окном, что не особо вяжется с parent/child как по мне.
Ну я полагал что точка где случился mouseDown покрывается обоими виджетами - иначе зачем городить такую реакцию на мышь? Ладно, пусть даже 2 окна. Так или иначе дело сводится к делегированию - и только то что делегировано будет работать. Привлекать множественное наследование не ошибка, но, как часто бывает, простое членство не хуже
Записан
Hellrider
Гость
« Ответ #19 : Январь 04, 2013, 18:45 »

кастомные события же всё равно не будут работать, будь виджет хоть ребенком. к тому же, виджет является отдельным окном, что не особо вяжется с parent/child как по мне.
Ну я полагал что точка где случился mouseDown покрывается обоими виджетами - иначе зачем городить такую реакцию на мышь? Ладно, пусть даже 2 окна. Так или иначе дело сводится к делегированию - и только то что делегировано будет работать. Привлекать множественное наследование не ошибка, но, как часто бывает, простое членство не хуже

Можно пример реализации? Я с делегатами еще толком не сталкивался
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Январь 04, 2013, 19:14 »

Можно пример реализации? Я с делегатами еще толком не сталкивался
Здесь "делегат" - в смысле паттерн программирования. Напр так
Код
C++ (Qt)
void Timer::mousePressEvent(QMouseEvent* pe)
{
qDebug() << Q_FUNC_INFO;
wh->mousePressEvent(pe);  
}
Остальное в том же духе, без класса A. Можно и наоборот, Widget::mousePressEvent вызывает Timer::mousePressEvent. Можно и оба вместе, только пресечь рекурсию. Разницы по существу никакой, kambala просто обобщил этот механизм
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4746



Просмотр профиля WWW
« Ответ #21 : Январь 04, 2013, 19:19 »

Hellrider хочет, чтобы и у Timer и у Widget реализация указанных событий была одинаковая, потому я и пошел через множественное наследование.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.194 секунд. Запросов: 22.