QT:即使在 setfocus() 之后也无法用键盘控制我的 QGraphicsPixmapItem
QT: cannot control my QGraphicsPixmapItem with keyboard even after setfocus()
我正在制作一个需要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
主.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
您一直无法移动项目,您所做的是移动滚动条,在视觉部分产生相同的效果。
你要做的是使用QGraphicsView
的KeyPress
事件,一种方法是创建一个继承自QGraphicsView
的新类,但另一种更简单的方法是安装一个事件过滤器,如下所示:
主窗口.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;
}
在以下链接中,您可以找到完整的示例
相关文章:
- 物理键盘上的触发器按键
- 如何使用C/C++在MacOSX中获得键盘布局
- 控制允许动态运行c++的并发操作数
- 从控制台中删除最后打印的元素
- 是否可以使用if constexpr删除控制流语句
- 无法在windows控制台中为C++程序提供必要的输入
- 控制到达非空函数clang(-Wreturn-type)的末尾
- 视窗键盘输入 c++
- 查找 GCD:并非所有控制路径都返回值
- 通过 API 控制 DJI 相机
- 禁止在控制台上记录谷神星
- 将鼠标和键盘输入发送到 unity3d 游戏 (Rust)
- 是否可以使用一个类来控制 C++ 中另一个类的对象?(阿杜伊诺)
- C ++异步键盘输入(标准方式)
- 如何删除列出的"QGraphicsPathItem"对象以控制进程内存使用情况?
- 键盘不起作用 - Arduino Uno - 与变量有关的多个错误
- QT:即使在 setfocus() 之后也无法用键盘控制我的 QGraphicsPixmapItem
- 如何使用C++来控制 TabTip 键盘的显示和关闭
- 从键盘获取C++中的任何键,包括控制等键
- 用于控制鼠标或键盘的程序