QT: не может управлять моим QGraphicsPixmapItem с помощью клавиатуры даже после setfocus () - PullRequest
0 голосов
/ 04 июня 2018

Я создаю игру, требующую перемещения qgraphicspixmapitem в представлении.

Теперь я планирую перемещать мой QGraphicsPixmapitem вверх и вниз с помощью клавиатуры.Первоначально работает отлично.

Но так как размер моей сцены и вида неодинаков, это выглядит довольно странно.Поэтому я добавил несколько функций, чтобы отрегулировать размер моей сцены и вида так, чтобы они были одинаковыми.

Однако после установки одинакового размера моих QGraphicsScene и QGraphicsView я больше не могу перемещать свой qgraphicspixmapitem с помощью клавиатуры.

Я попытался добавить setFocus, Flag чтобы мой qgraphicspimapitem оставался под контролем моей клавиатуры, но напрасно.

Любая идея будет высоко оценена.Спасибо!

главное окно.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent):
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{ 
    //scene
    scene = new QGraphicsScene(0, 0, 1050, 600);

    //player
    player = new QGraphicsPixmapItem(QPixmap(":/img/whitedog.png").scaled(100,100));
    player->setFlag(QGraphicsPixmapItem:: ItemIsFocusable,true);
    player->setFocus();
    player->setPos(350, 500);
    scene->addItem(player);
    playertimer->start(10);

    //view
    view = new QGraphicsView(this);
    view ->setScene(scene);
    view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    setCentralWidget(view);
    view->setFixedSize(1055,605);
}

void MainWindow::keyPressEvent(QKeyEvent *e)
{
    if (e->key() == Qt::Key_Down){
        player->setPos(player->x(),player->y()+10);
    }

    else if (e->key() == Qt::Key_Up){
        player->setPos(player->x(),player->y()-10);
    }

    }
}

главное окно.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsPixmapItem>
#include <QKeyEvent>
#include <QtGui>


namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:
    virtual void keyPressEvent(QKeyEvent *e);

private:
    Ui::MainWindow *ui;
    QGraphicsScene *scene;
    QGraphicsItem *player;
    QGraphicsView * view;
};

#endif // MAINWINDOW_H

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

1 Ответ

0 голосов
/ 04 июня 2018

Вам никогда не удавалось переместить элемент, поэтому вы переместили полосы прокрутки, создавая тот же эффект в визуальной части.

Что вам нужно сделать, это использовать событие KeyPressQGraphicsView, один из способов сделать это - создать новый класс, который наследуется от QGraphicsView, но другой более простой способ - установить фильтр событий, как показано ниже:

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QGraphicsPixmapItem>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QKeyEvent>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //scene
    scene = new QGraphicsScene(0, 0, 1050, 600);
    //player
    player = new QGraphicsPixmapItem(QPixmap(":/img/whitedog.png").scaled(100,100));
    player->setPos(350, 500);
    scene->addItem(player);
    //view
    view = new QGraphicsView;
    view ->setScene(scene);
    view->installEventFilter(this);
    setCentralWidget(view);
    view->setFixedSize(1055,605);
}

bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == view && event->type() == QEvent::KeyPress){
        QKeyEvent *kevent = static_cast<QKeyEvent *>(event);
        if(kevent->key() == Qt::Key_Down){
            player->setPos(player->pos() + QPointF(0, 10));
            return true;
        }
        else if(kevent->key() == Qt::Key_Up){
            player->setPos(player->pos() - QPointF(0, 10));
            return true;
        }
    }
    return QMainWindow::eventFilter(watched, event);
}

MainWindow::~MainWindow()
{
    delete ui;
}

В следующей ссылке вы можете найти полный пример

...