Доброго времени суток,
Решил поделать курсач. Для этого выбрал библиотеку 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
}
}
обрисую в общих чертах, как сделать правильно для твоей программы.
Создай класс который будет генерить сигналы нажатия/отжатия кнопок.
Для это в конструкторе класса установи
if (qApp)
{
qApp->installEventFilter(this);
}
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;
}
Спасибо за скорый ответ.
Такс, создал класс(мб что то не правильно понял):
#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();
}
Вопрос почти в тему:
Как подписаться на таймер?
Имеется ввиду, в таких же условиях работы с QGraphicsScene, ну и новичка, в качестве автора.
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(processOneThing()));
timer->start();
где processOneThing твоя функция член класса, которая вызывается каждый раз, когда происходит событие таймера...Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)