Russian Qt Forum

Qt => Вопросы новичков => Тема начата: joynter от Август 15, 2012, 13:19



Название: отваливаются события мыши и клавиатуры
Отправлено: joynter от Август 15, 2012, 13:19
с перехватом событий в классе
Код:
#include <QWidget>

class ttt : public QWidget
{
    Q_OBJECT
public:
    explicit ttt(QWidget *parent = 0);

protected:
    virtual void keyPressEvent(QKeyEvent* event)
    {
        int cp=1;
    }

    virtual void mousePressEvent( QMouseEvent* pe )
    {
        int cp=1;
    }
};
поблем нет - они перехватываются. но если экземпляр этого класса сделать членом другого класса
Код:
#include <QMainWindow>
#include "ttt.h"

class qqq : public QMainWindow
{
    Q_OBJECT
public:
    explicit qqq(QWidget *parent = 0):
        QMainWindow(parent)
    {
        t = new ttt();
    }
    ttt * t;
};


то события keyPressEvent и mousePressEvent не происходят. пожалуйста объясните почему?

на всякий случай main
Код:
#include "qqq.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //ttt * frm = new ttt();
    qqq * frm = new qqq();
    frm->resize( 1200, 600 );
    frm->show();

    return a.exec();
}


Название: Re: отваливается события мыши и клавиатуры
Отправлено: Bepec от Август 15, 2012, 13:25
А зачем они вам виртуальные?
А зачем вам explicit?

PS у вас такие хорошие названия переменных и классов - прям вываливаются глазки. Как у картошечки :)


Название: Re: отваливается события мыши и клавиатуры
Отправлено: joynter от Август 15, 2012, 13:29
А зачем они вам виртуальные?
А зачем вам explicit?

PS у вас такие хорошие названия переменных и классов - прям вываливаются глазки. Как у картошечки :)
а разве в этом дело?
explicit вставил автогенератор, а virtual - показывает, что они переопределены. для чистоты эксперимента убрал все explicit и virtual - результат не изменился


Название: Re: отваливаются события мыши и клавиатуры
Отправлено: Bepec от Август 15, 2012, 14:09
Хз. Просто излишне.

А у вас, извините, show для ttt вызывается?


Название: Re: отваливаются события мыши и клавиатуры
Отправлено: joynter от Август 15, 2012, 14:56
Хз. Просто излишне.

А у вас, извините, show для ttt вызывается?
в конструкторе qqq делал
t->resize( 1200, 600 );
t->show();

но в этом случае появляются два окна: одно - экземпляр класса ttt, а другое - qqq, и в qqq реакции на клаву и мышь нет. мне нужно, чтобы реакция была только в члене класса qqq


Название: Re: отваливаются события мыши и клавиатуры
Отправлено: Alex Custov от Август 15, 2012, 15:10
но в этом случае появляются два окна: одно - экземпляр класса ttt, а другое - qqq, и в qqq реакции на клаву и мышь нет. мне нужно, чтобы реакция была только в члене класса qqq

события мыши и клавиатуры, которые можно перехватить через данные виртуальные функции, происходят только внутри этого виджета. Если виджет спрятан, то никаких событий он получать не будет. Если нужно перехватывать события внутри всего приложения, то ставь event filter на qApp.

Задача к тому же неясна, опиши задачу подробно.


Название: Re: отваливаются события мыши и клавиатуры
Отправлено: Bepec от Август 15, 2012, 15:12
Проще выражаясь - у тебя окно спрятано -> окно не получает евентов -> не срабатывают слоты.
Тебе надо ему родителя указать qqq. Тогда он будет отображаться НА qqq и перехватывать сигналы в себе.


Название: Re: отваливаются события мыши и клавиатуры
Отправлено: joynter от Август 15, 2012, 15:17
но в этом случае появляются два окна: одно - экземпляр класса ttt, а другое - qqq, и в qqq реакции на клаву и мышь нет. мне нужно, чтобы реакция была только в члене класса qqq

события мыши и клавиатуры, которые можно перехватить через данные виртуальные функции, происходят только внутри этого виджета. Если виджет спрятан, то никаких событий он получать не будет. Если нужно перехватывать события внутри всего приложения, то ставь event filter на qApp.

Задача к тому же неясна, опиши задачу подробно.
если подробно, то виджет ttt должен являться частью главной формы qqq и нужно перехватывать события именно в виджете ttt. на этом виджете рисуются объекты, которые нужно удалять кнопкой Delete. как мне его "поднять" ?

PS: в реальном проекте ситуация еще непонятней: реакция на мышь есть, а вот на клаву - нет


Название: Re: отваливаются события мыши и клавиатуры
Отправлено: Bepec от Август 15, 2012, 15:29
Сделай проще - используй дизайнер и контекстное меню Promote to...

Добавляй в дизайнере QWidget, тыкай ему протоме и пиши свой класс. И вуаля.


Название: Re: отваливаются события мыши и клавиатуры
Отправлено: andrew.k от Август 15, 2012, 15:39
Хз. Просто излишне.
Ты не прав.
explicit здесь не лишнее!


Название: Re: отваливается события мыши и клавиатуры
Отправлено: andrew.k от Август 15, 2012, 15:41
А зачем они вам виртуальные?
А зачем вам explicit?

PS у вас такие хорошие названия переменных и классов - прям вываливаются глазки. Как у картошечки :)
а разве в этом дело?
explicit вставил автогенератор, а virtual - показывает, что они переопределены. для чистоты эксперимента убрал все explicit и virtual - результат не изменился
зря послушал вереса. верни explicit на место. А заодно прочитай в гугле зачем он нужен и заодно объясни вересу)
И неужели фантазии не хватает на нормальные имена?


Название: Re: отваливаются события мыши и клавиатуры
Отправлено: joynter от Август 15, 2012, 16:47
заметил еще такую вещь: если в конструктор qqq добавить setCentralWidget
Код:
qqq::qqq(QWidget *parent) :
    QMainWindow(parent)
{
    t = new ttt( this );
    t->resize( 1200, 600 );
    setCentralWidget( t );
}
то появляется реакция на мышь, но клава все еще не реагирует


Название: Re: отваливаются события мыши и клавиатуры
Отправлено: demaker от Сентябрь 13, 2012, 15:07
 :) Да действительно что-то не получается.

попытался так:
Код:
example::example(QWidget *parent)
    : QWidget(parent)
{
ui.setupUi(this);

exmp* e = new exmp(this);
QVBoxLayout*vbl =  new QVBoxLayout(this);
vbl->addWidget(e);
}
события обрабатываются в еxmp

Код:
virtual void keyPressEvent(QKeyEvent* event)
        {
            int cp=1;
            qDebug() <<"Keypressed "<<"cp ="<<cp;
            event->accept();
        }

    virtual void mousePressEvent( QMouseEvent* pe )
        {
            int cp=1;
            qDebug() <<"MousePressed"<<"cp ="<<cp;
            pe->accept();
        }
Только мышь срабатывает,а клавиатура нет.
 ??? Подскажите почему?


Название: Re: отваливаются события мыши и клавиатуры
Отправлено: demaker от Сентябрь 13, 2012, 15:44
Ради интереса добавил в exmp  QTextEdit

Код:
#include "exmp.h"

exmp::exmp(QWidget *parent)
    : QWidget(parent)
{
te = new QTextEdit(this);
vbl = new QVBoxLayout(this);
vbl->addWidget(te);
}

exmp::~exmp()
{
}

и все тоже самое, правда если курсор находится в textedit то qDebug не выводит собщение ???


Название: Re: отваливаются события мыши и клавиатуры
Отправлено: Alex Custov от Сентябрь 13, 2012, 15:58
же самое, правда если курсор находится в textedit то qDebug не выводит собщение ???

Естественно, потому что QTextEdit кушает события клавиатуры и не передаёт их наверх своему родителю.


Название: Re: отваливаются события мыши и клавиатуры
Отправлено: demaker от Сентябрь 13, 2012, 19:31
Но и без QTextEdit тоже самое было, почему ???


Название: Re: отваливаются события мыши и клавиатуры
Отправлено: Alex Custov от Сентябрь 13, 2012, 19:36
Но и без QTextEdit тоже самое было, почему ???

никогда такого не делал, да и лень проверять, но почти наверняка события клавиатуры не приходят потому, что виджет не в фокусе. Это дефолтное поведение для обычного QWidget, он не принимает фокус. Возможно, можно починить изменив focusPolicy.


Название: Re: отваливаются события мыши и клавиатуры
Отправлено: demaker от Сентябрь 14, 2012, 09:29
Попробую ;)


Название: Re: отваливаются события мыши и клавиатуры
Отправлено: demaker от Сентябрь 14, 2012, 09:40
Да действительно :)
добавил
Код:

#include "exmp.h"
exmp::exmp(QWidget *parent)
    : QWidget(parent)
{
    this->setFocusPolicy(Qt::ClickFocus);// добавил вот эту строчку
}

exmp::~exmp()
{
}

и все работает ,спасибо ;)