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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: отваливаются события мыши и клавиатуры  (Прочитано 7490 раз)
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();
}
« Последнее редактирование: Август 15, 2012, 13:33 от joynter » Записан
Bepec
Гость
« Ответ #1 : Август 15, 2012, 13:25 »

А зачем они вам виртуальные?
А зачем вам explicit?

PS у вас такие хорошие названия переменных и классов - прям вываливаются глазки. Как у картошечки Улыбающийся
Записан
joynter
Гость
« Ответ #2 : Август 15, 2012, 13:29 »

А зачем они вам виртуальные?
А зачем вам explicit?

PS у вас такие хорошие названия переменных и классов - прям вываливаются глазки. Как у картошечки Улыбающийся
а разве в этом дело?
explicit вставил автогенератор, а virtual - показывает, что они переопределены. для чистоты эксперимента убрал все explicit и virtual - результат не изменился
Записан
Bepec
Гость
« Ответ #3 : Август 15, 2012, 14:09 »

Хз. Просто излишне.

А у вас, извините, show для ttt вызывается?
Записан
joynter
Гость
« Ответ #4 : Август 15, 2012, 14:56 »

Хз. Просто излишне.

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

но в этом случае появляются два окна: одно - экземпляр класса ttt, а другое - qqq, и в qqq реакции на клаву и мышь нет. мне нужно, чтобы реакция была только в члене класса qqq
« Последнее редактирование: Август 15, 2012, 15:10 от joynter » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #5 : Август 15, 2012, 15:10 »

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

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

Задача к тому же неясна, опиши задачу подробно.
Записан
Bepec
Гость
« Ответ #6 : Август 15, 2012, 15:12 »

Проще выражаясь - у тебя окно спрятано -> окно не получает евентов -> не срабатывают слоты.
Тебе надо ему родителя указать qqq. Тогда он будет отображаться НА qqq и перехватывать сигналы в себе.
Записан
joynter
Гость
« Ответ #7 : Август 15, 2012, 15:17 »

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

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

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

PS: в реальном проекте ситуация еще непонятней: реакция на мышь есть, а вот на клаву - нет
« Последнее редактирование: Август 15, 2012, 15:25 от joynter » Записан
Bepec
Гость
« Ответ #8 : Август 15, 2012, 15:29 »

Сделай проще - используй дизайнер и контекстное меню Promote to...

Добавляй в дизайнере QWidget, тыкай ему протоме и пиши свой класс. И вуаля.
Записан
andrew.k
Гость
« Ответ #9 : Август 15, 2012, 15:39 »

Хз. Просто излишне.
Ты не прав.
explicit здесь не лишнее!
Записан
andrew.k
Гость
« Ответ #10 : Август 15, 2012, 15:41 »

А зачем они вам виртуальные?
А зачем вам explicit?

PS у вас такие хорошие названия переменных и классов - прям вываливаются глазки. Как у картошечки Улыбающийся
а разве в этом дело?
explicit вставил автогенератор, а virtual - показывает, что они переопределены. для чистоты эксперимента убрал все explicit и virtual - результат не изменился
зря послушал вереса. верни explicit на место. А заодно прочитай в гугле зачем он нужен и заодно объясни вересу)
И неужели фантазии не хватает на нормальные имена?
« Последнее редактирование: Август 15, 2012, 15:44 от andrew.k » Записан
joynter
Гость
« Ответ #11 : Август 15, 2012, 16:47 »

заметил еще такую вещь: если в конструктор qqq добавить setCentralWidget
Код:
qqq::qqq(QWidget *parent) :
    QMainWindow(parent)
{
    t = new ttt( this );
    t->resize( 1200, 600 );
    setCentralWidget( t );
}
то появляется реакция на мышь, но клава все еще не реагирует
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #12 : Сентябрь 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();
        }
Только мышь срабатывает,а клавиатура нет.
 Непонимающий Подскажите почему?
« Последнее редактирование: Сентябрь 13, 2012, 15:27 от demaker » Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #13 : Сентябрь 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 не выводит собщение Непонимающий
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #14 : Сентябрь 13, 2012, 15:58 »

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

Естественно, потому что QTextEdit кушает события клавиатуры и не передаёт их наверх своему родителю.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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