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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Переопределенные события для класса и новый виджет  (Прочитано 12063 раз)
Hellrider
Гость
« : Январь 03, 2013, 15:41 »

Пример класса
Код:
class Test : public QLabel{
private:
QPoint point;
QWidget wgt;
protected:
    virtual void mousePressEvent(QMouseEvent* pe){
        if(pe->button() & Qt::LeftButton)
            point = pe->pos();
                    }
    virtual void mouseMoveEvent(QMouseEvent* pe){
        move(pe->globalPos() - point);
           }
    virtual void keyPressEvent(QKeyEvent* pe){
        if(pe->key() & Qt::Key_Enter){
            slotStart();
        }
            }
public:
Test(QWidget* parent = 0) : QLabel(parent){
// основное окно
//.....
//.....
wgt.show();
}
Как сделать, чтобы виджет wgt работал с переопределенными событиями класса?  В главном виджете класса события работают, а в созданном нет.
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



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

Если я правильно тебя понял, то в переопределенных методах нужно вызывать их парент-реализации.
Код
C++ (Qt)
virtual void mousePressEvent(QMouseEvent* pe)
{
   QLabel::mousePressEvent( pe );
   if(pe->button() & Qt::LeftButton)
       point = pe->pos();
}
 
Записан
Hellrider
Гость
« Ответ #2 : Январь 03, 2013, 16:09 »

Если я правильно тебя понял, то в переопределенных методах нужно вызывать их парент-реализации.
Код
C++ (Qt)
virtual void mousePressEvent(QMouseEvent* pe)
{
   QLabel::mousePressEvent( pe );
   if(pe->button() & Qt::LeftButton)
       point = pe->pos();
}
 

Ну  QLabel добавлять не нужно, он и так работает, а вот виджет wgt не взаимодействует с этими событиями. Пробовал добавить QWidget::mousePressEvent(pe); не помогло.
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



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

Напиши, что хочешь сделать. Потому, что не понятно, как этот виджет должен взаимодействовать и с чем.
Записан
Hellrider
Гость
« Ответ #4 : Январь 03, 2013, 16:27 »

Напиши, что хочешь сделать. Потому, что не понятно, как этот виджет должен взаимодействовать и с чем.

Мне нужно, чтобы виджет wgt таким же способом перемещался мышкой, как главный виджет в классе, который использует переопределенные события мыши.
Записан
Dancing_on_water
Гость
« Ответ #5 : Январь 03, 2013, 16:44 »

тогда тебе нужно в конструторе:
Код:
 wgt.setParent(this);
Записан
Hellrider
Гость
« Ответ #6 : Январь 03, 2013, 16:56 »

тогда тебе нужно в конструторе:
Код:
 wgt.setParent(this);
wgt.setParent(this); засовывает wgt в главный виджет. wgt идет отдельным окном.
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #7 : Январь 03, 2013, 16:58 »

wgt идет отдельным окном.
Тогда, делай отдельный класс-наследник QWidget и переопределяй обработчики событий мыши. Ну и используй го в классе Test.
Записан
Dancing_on_water
Гость
« Ответ #8 : Январь 03, 2013, 17:03 »

wgt.setParent(this); засовывает wgt в главный виджет. wgt идет отдельным окном.
А теперь все сначала. Давай обрисовывай ситуацию целиком, иначе все советы -  это пальцем в небо. Нужно что есть, что хотим и какие проблемы.

Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #9 : Январь 03, 2013, 17:25 »

насколько я понял, автор хочет, чтобы реализация событий «принадлежала» как унаследованному лейблу, так и виджету, содержащемуся в нем. должно подойти множественное наследование, только придется хранить указатели на методы move() и slotStart().
Записан

Изучением 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
Hellrider
Гость
« Ответ #10 : Январь 03, 2013, 17:26 »

wgt.setParent(this); засовывает wgt в главный виджет. wgt идет отдельным окном.
А теперь все сначала. Давай обрисовывай ситуацию целиком, иначе все советы -  это пальцем в небо. Нужно что есть, что хотим и какие проблемы.


У меня есть класс унаследованный от QLabel.
Код:
class Timer : public QLabel
{
    Q_OBJECT
private:
QPoint point;
QWidget wh;
protected:
    virtual void Timer::mousePressEvent(QMouseEvent* pe){
        if(pe->button() & Qt::LeftButton)
            point = pe->pos();
         }
    virtual void Timer::mouseMoveEvent(QMouseEvent* pe){
        move(pe->globalPos() - point);
           }
    virtual void Timer::keyPressEvent(QKeyEvent* pe){
        if(pe->key() & Qt::Key_Enter){
            slotStart();
        }
            }
public:
    Timer(QWidget *parent = 0);
}

В конструкторе создается гуи и т.д. для wh виджета и для главного виджета. Главный виджет с флагом Qt::FramelessWindowHint, поэтому переопределены события мыши.
 В главном виджете через кнопку вызывается слот, который отображает виджет в отдельном окне wh.show(). В отдельное окно я тоже хочу поставить флаг  Qt::FramelessWindowHint,
но wh виджет не взаимодействует с событиями, которые в классе. Мне нужно както переопределить события мыши для wh виджета или связать этот виджет с событиями в классе.
Записан
Hellrider
Гость
« Ответ #11 : Январь 03, 2013, 17:28 »

насколько я понял, автор хочет, чтобы реализация событий «принадлежала» как унаследованному лейблу, так и виджету, содержащемуся в нем. должно подойти множественное наследование, только придется хранить указатели на методы move() и slotStart().

Так точно. Можно пример, как это правильно реализовать?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #12 : Январь 03, 2013, 18: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();
   }
};
Записан

Изучением 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
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



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

думал как-то так можно сделать, но не получается добраться до реального виджета в mouseMoveEvent (reinterpret_cast тоже не помогает):
Его можно передавать в качестве параметра.

А для нормального переопределения метод A::self хорошо бы сделать виртуальным.
« Последнее редактирование: Январь 03, 2013, 19:50 от Old » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



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

Его можно передавать в качестве параметра.
тоже об этом подумал потом
А для нормального переопределения метод A::self хорошо бы сделать виртуальным.
согласен
Записан

Изучением 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.202 секунд. Запросов: 23.