QT:即使在 setfocus() 之后也无法用键盘控制我的 QGraphicsPixmapItem

Posted

技术标签:

【中文标题】QT:即使在 setfocus() 之后也无法用键盘控制我的 QGraphicsPixmapItem【英文标题】:QT: cannot control my QGraphicsPixmapItem with keyboard even after setfocus() 【发布时间】:2018-06-04 08:13:37 【问题描述】:

我正在制作一个需要 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】:

您从未能够移动项目,您所做的是移动滚动条在视觉部分产生相同的效果。

您需要做的是使用QGraphicsViewKeyPress 事件,一种方法是创建一个继承自QGraphicsView 的新类,但另一种更简单的方法是将事件过滤器安装为如下图:

ma​​inwindow.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;

在下面的link你可以找到完整的例子

【讨论】:

非常感谢你:)它神奇地工作!!!我以前从不知道eventFilter,感谢您的宝贵分享。我从你的回答中学到了很多^^

以上是关于QT:即使在 setfocus() 之后也无法用键盘控制我的 QGraphicsPixmapItem的主要内容,如果未能解决你的问题,请参考以下文章

即使有焦点也无法访问组合框文本属性

Qt - 即使 QMainWindow 太小也允许停靠

为啥即使在添加程序集“Microsoft.SqlServer.ConnectionInfo”之后 C# 也无法识别 Server()

无法绑定到“routerLink”,因为即使在导入 RouterModule 之后它也不是已知属性

即使在等待之后,Python 中的 Selenium 也无法识别 DOM 中的变化

编辑器中的 Qt 创建者 CPU 使用率高