2015-01-13 2 views
0

Ключевой прослушиватель событий или функция repaint() не работают, я попытался вызвать paintEvent (QPaintEvent *) напрямую, но он также не помог, благодаря дальнейшим ответам.Действия Qt или функция repaint() не работают

Вот код:

window.h

#ifndef WINDOW_H 
#define WINDOW_H 

#include <QWidget> 
#include <QPainter> 
#include <QPaintEvent> 
#include <QRectF> 

namespace Ui { 
class Window; 
} 

class Window : public QWidget 
{ 
    Q_OBJECT 

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

    void paintEvent(QPaintEvent *); 
    void keyPressEvent(QKeyEvent * ); 

private: 
    Ui::Window *ui; 

    QRectF player; 

    QPainter * painter = new QPainter(this); 
}; 

#endif // WINDOW_H 

window.cpp

#include "window.h" 
#include "ui_window.h" 

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

    player.setX(0); 
    player.setY(0); 
    player.setWidth(50); 
    player.setHeight(50); 
} 

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

void Window::paintEvent(QPaintEvent *) 
{ 
    QPainter painter(this); 
    painter.setPen(QPen(Qt::black, 3, Qt::DashDotLine, Qt::RoundCap)); 
    painter.setBrush(QBrush(Qt::blue)); 
    painter.setRenderHint(QPainter::Antialiasing, true); 
    painter.drawEllipse(player.x(), player.y(), player.width(), player.height()); 
} 

void Window::keyPressEvent(QKeyEvent * event) 
{ 
    if(event->type() == Qt::Key_W) 
     player.setY(player.y() - 1); 
    if(event->type() == Qt::Key_S) 
     player.setY(player.y() + 1); 
    if(event->type() == Qt::Key_A) 
     player.setX(player.x() - 1); 
    if(event->type() == Qt::Key_D) 
     player.setX(player.x() + 1); 
    repaint(); 
} 

main.cpp

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

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

    return a.exec(); 
} 
+0

Что не работает? Что-нибудь отображается? Вы пытались добавить строки printf в функции, чтобы узнать, вызваны ли они или нет? Будьте более конкретными. –

+0

отображаются начальные чертежи, но нажатие клавиш не отвечает и перерисовывает() не вызывается или не работает –

+0

Добавьте код отладки в keyPressEvent. Скорее всего, он никогда не вызывается, потому что виджет не имеет фокуса клавиатуры. Если он никогда не вызывается, попробуйте добавить w.setFocus() –

ответ

2

В Window::keyPressEvent заменить event->type() с event->key() всюду.

Также посмотрите на выход компилятора. Я думаю, он должен был предупредить вас о сравнении QEvent::Type с объектами Qt::Key.

+0

Большое спасибо! –

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