crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в QGraphicsView + KeyPress Event
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
ViGOur Дата 25.1.2012, 12:49
 
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(processOneThing()));
timer->start();
где processOneThing твоя функция член класса, которая вызывается каждый раз, когда происходит событие таймера...

Смотри: QTimer - Подробное описание
Гость Дата 25.1.2012, 9:59
  Вопрос почти в тему:
Как подписаться на таймер?

Имеется ввиду, в таких же условиях работы с QGraphicsScene, ну и новичка, в качестве автора.
DerKetzer Дата 13.11.2011, 5:47
 
Цитата(wiz29 @ 9.11.2011, 8:27) *
Цитата(DerKetzer @ 7.11.2011, 14:59) *
Наследником чего должен быть класс keyPress? Я так понял, что QGraphicsView... так ли это?


Достаточно унаследоваться от QObject


Спасибо, разобрался)
wiz29 Дата 9.11.2011, 8:27
 
Цитата(DerKetzer @ 7.11.2011, 14:59) *
Наследником чего должен быть класс keyPress? Я так понял, что QGraphicsView... так ли это?


Достаточно унаследоваться от QObject
DerKetzer Дата 7.11.2011, 13:59
  Спасибо за скорый ответ.
Такс, создал класс(мб что то не правильно понял):
#include <QGraphicsView>
#include <QObject>

class keyPress
{
public:
    keyPress();
    bool eventFilter(QObject* obj, QEvent* e);
protected:
    void KeyReleased(QKeyEvent* e);
    void KeyPressed(QKeyEvent* e);
    QObject* pObj;
private:
    std::map<int, bool> m_keyMap;
};


реализация:

#include <QMessageBox>
#include <QtCore>
#include <QtGui>

keyPress::keyPress()
{
    if(qApp) qApp->installEventFilter (this);
}

void keyPress::KeyReleased(QKeyEvent* e)
{
    QMessageBox msgBox;
    if(e->key ()==Qt::Key_W) msgBox.setText("bla.");

}

void keyPress::KeyPressed(QKeyEvent* e)
{
    QMessageBox msgBox;
    if(e->key ()==Qt::Key_Z) msgBox.setText("The document has been modified.");
}

bool keyPress::eventFilter(QObject* pObj, QEvent* e)
{
...
}

int main(int argc, char **argv)
{
     QApplication app(argc, argv);
     qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
     QGraphicsScene scene;
     QGraphicsView view(&scene);
     keyPress key;
     for (int i = 0; i < 8; ++i) {
         Tanks *tank= new Tanks;
         scene.addItem(tank);
     }
     view.show();
     return app.exec();
}


Наследником чего должен быть класс keyPress? Я так понял, что QGraphicsView... так ли это?
wiz29 Дата 7.11.2011, 12:08
  обрисую в общих чертах, как сделать правильно для твоей программы.
Создай класс который будет генерить сигналы нажатия/отжатия кнопок.
Для это в конструкторе класса установи
    if (qApp)
    {
        qApp->installEventFilter(this);
    }


далее в процедуре фильтра событий обрабатывай QEvent::KeyPress и генери сигнал.
выглядеть это будет примерно следующим образом
bool AppKeyHook::eventFilter(QObject* pObj, QEvent* e)
{
    if (pObj)
    {
        if (e->type() == QEvent::KeyPress)
        {
            QKeyEvent* pKeyEv = static_cast<QKeyEvent*>(e);
            if (!pKeyEv->isAutoRepeat())
            {
                std::map<int, bool>::iterator pos = m_keyMap.find(pKeyEv->key());
                if (pos != m_keyMap.end())
                {
                    if (pos->second == false)
                    {
                        pos->second = true;
                        emit KeyPressed(pKeyEv->key());
                    }
                }
                else
                {
                    m_keyMap[pKeyEv->key()] = true;
                    emit KeyPressed(pKeyEv->key());
                }
            }
        }
        else if (e->type() == QEvent::KeyRelease)
        {
            QKeyEvent* pKeyEv = static_cast<QKeyEvent*>(e);            
            if (!pKeyEv->isAutoRepeat())
            {
                std::map<int, bool>::iterator pos = m_keyMap.find(pKeyEv->key());
                if (pos != m_keyMap.end())
                {
                    if (pos->second == true)
                    {
                        pos->second = false;
                        emit KeyReleased(pKeyEv->key());
                    }
                }
                else
                {
                    m_keyMap[pKeyEv->key()] = false;
                    emit KeyReleased(pKeyEv->key());
                }
            }
        }
    }
    return false;
}

все довольно просто
DerKetzer Дата 6.11.2011, 22:44
  Доброго времени суток,
Решил поделать курсач. Для этого выбрал библиотеку QT(раньше с ней дело не имел)...
Пытаюсь создать небольшую игрушку. Для этого использую QPainter + QGraphicsView + QGraphicsScene. Как рисовать я понял... Но как считывать нажатие клавиш?

Код main'a:

int main(int argc, char **argv)
{
     QApplication app(argc, argv);
     qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
     QGraphicsScene scene;
     QGraphicsView view;
     for (int i = 0; i < 8; ++i) {
     Tanks *tank= new Tanks;
     scene.addItem(tank);
     }
     view.show();
     return app.exec();
}


Если вставить функцию:

void QGraphicsView::KeyPressEvent(QKeyEvent* event){
    if(event->key()==Qt::Key_W) {
         //Do Smth
    }
}


То при нажатии на 'W' ничего не происходит.

Помогите нубасу пожалуйста! :)
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 23:31