2015-11-07 2 views
0

Я пытаюсь переместить поле «QGraphicsItem» с помощью moveBy(). Если я поместил keyPressEvent в класс элемента - это работа, но если я поместил эту функцию в класс mainwindow и попробую вызвать функцию moveBy() с помощью указателя - это не сработает. Что я делаю не так?Перемещение QGraphicsItem с помощью moveBy

item.h:

#ifndef ITEM_H 
#define ITEM_H 


#include <QGraphicsItem> 
#include <QGraphicsView> 
#include <QKeyEvent> 
class item: public QGraphicsItem 
{ 
public: 
    //virtual void keyPressEvent(QKeyEvent *event); 

    item(QGraphicsItem *parent =NULL); 
    QRectF boundingRect() const; 


    protected: 
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget); 
}; 

#endif // ITEM_H 

mainwindow.h:

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include "item.h" 

namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    item *box; 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 
    virtual void keyPressEvent(QKeyEvent *event); 
private: 
    Ui::MainWindow *ui; 
}; 

#endif // MAINWINDOW_H 

item.cpp:

#include "item.h" 

item::item(QGraphicsItem *parent): QGraphicsItem(parent) 
{ 
    setFlag(QGraphicsItem::ItemIsFocusable); 
} 

QRectF item::boundingRect() const 
{ 
    return QRectF(0,0,200,200); 

} 

void item::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) 
{ 

    painter->drawPixmap(1,1, QPixmap(":/Graphics/Untitled.png")); 
} 

/* 
void item::keyPressEvent(QKeyEvent *event) 
{ 
    switch(event->key()) 
    { 
    case Qt::Key_Right: 
     moveBy(3,0); 
     break; 


    case Qt::Key_Left: 
     moveBy(-3,0); 
     break; 


    case Qt::Key_Up: 
     moveBy(0,-3); 
     break; 


    case Qt::Key_Down: 
      moveBy(0,3); 

     break; 

    } 


} 
*/ 

mainwindow.cpp:

#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include "QGraphicsScene" 
#include "QGraphicsView" 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 

    QGraphicsScene *scene = new QGraphicsScene; 
    box = new item; 
    scene->addItem(box); 
    QGraphicsView *view = new QGraphicsView; 
    view->setScene(scene); 
    view->show(); 
} 
MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

void MainWindow::keyPressEvent(QKeyEvent *event) 
{ 
    switch(event->key()) 
    { 
    case Qt::Key_Right: 
     box->moveBy(3,3); 
     break; 


    case Qt::Key_Left: 

     break; 


    case Qt::Key_Up: 

     break; 


    case Qt::Key_Down: 


     break; 

    } 


} 

ответ

0

Вы уверены, что ваша программа даже дойдет до MainWindow::keyPressEvent(QKeyEvent *event), когда вы нажмете клавишу? Попробуйте отладить или поместить smth, как этот qDebug() << "mouse key press in mainwindow"; в ваш метод MainWindow::keyPressEvent(QKeyEvent *event).

Ваш виджет должен захватывать события мыши для обработки этого события. Я почти уверен, что это не обманывает мышь. Другими словами, нужно сосредоточиться.

Смежные вопросы