Qt 그림 이동 인 스 턴 스 구현(그림 튜 토리 얼)

6690 단어 Qt그림 이동
이번 학기 실습 때 MFC 로 비행기 대전 을 한 적 이 있 는데,지루 한 것 을 Qt 로 하나 만 들 려 고 했 는데 학교 에 있 을 때 는 좀 퇴락 해서 돌아 와 봤 어 요.
먼저 해결 해 야 할 문 제 는 그림 의 이동 이다.비행기 라 니 총알 이 움 직 이 고 있 으 니 그림 은 당연히 달 려 야 한다.
잡담,우선 QtCreator 로 Paint Widget 이라는 QtGui 프로그램 을 새로 만 듭 니 다.마음대로 지은 이름,실험 이 아 닙 니까?

이 세 개의 파일 이 생 성 됩 니 다.그 중에서 ui 는 상관 하지 않 습 니 다.실험의 그림 이동 은 Event 를 사용 해 야 합 니 다.신호 슬롯 이 아니 기 때문에 ui 는 상관 하지 않 습 니 다.그것 을 놓 으 면 됩 니 다.

첫 번 째 단 계 는 그림 을 그 려 야 합 니 다.을 참조 하여 그림 을 그 리 는 것 이 어렵 지 않 습 니 다.바로 paintEvent 방법 을 다시 쓰 고 QPainter 대상 으로 그림 을 그 리 는 것 입 니 다.
 
void  PaintedWidget::paintEvent(QPaintEvent *event) 
{ 
        QPainter  painter(this); 
        QPixmap pixmap("Cat.png"); 
         QBitmap bitmap("Cat.png"); 
        painter.drawPixmap(10, 10, 128,  128, pixmap); 
        painter.drawPixmap(140, 10, 128, 128, bitmap);  
        QPixmap pixmap2("Cat2.png"); 
        QBitmap  bitmap2("Cat2.png"); 
        painter.drawPixmap(10, 140, 128, 128,  pixmap2); 
        painter.drawPixmap(140, 140, 128, 128, bitmap2); 
}
이것 은 그의 결과 이다.

문 제 는 그림 자원 을 어떻게 사용 하 느 냐 하 는 것 이다.
'C++GUI Qt4 프로 그래 밍(제2판)'이라는 책 에서 예 를 들 어 이 책의 원본 코드 를 직접 검색 한 결과 src\\chap 04 에서 Qt 인용 자원 이 사용 하 는 자원 파일 이라는 것 이 xml 이 고 QtCreator 에서 관리 하기 편리 하 다 는 것 을 발견 했다.
우선 프로젝트 에 파일 을 추가 하고 Qt 의 자원 파일 을 선택 하 십시오:
  
앞으로 그림 이 많 을 수 있 기 때문에 프로젝트 디 렉 터 리 에 img 이라는 폴 더 를 새로 만들어 그림 을 저장 합 니 다.
생 성 된 자원 파일 에 접 두 사 를 추가 합 니 다.이것 은 qt 에서 자원 을 참조 하 는 데 필요 한 것 입 니 다.나중에 다시 이야기 하 겠 습 니 다.파일 을 추가 하 는 것 은 잔소리 하지 않 아 도 됩 니 다.

설명 하기 편리 하도록 먼저 소스 코드 를 보 내 주세요.
mainwindow.h 
 
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
void paintEvent (QPaintEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void keyPressEvent(QKeyEvent *event);

private:
Ui::MainWindow *ui;
QPixmap *catImg;
QRect *catImgRect;

protected:
int shrinkMultiple;
int speed;
};

#endif // MAINWINDOW_H
그 중 QPixmap*catImg;바로 사진 대상 의 지침 입 니 다.제 그림 은 항상 고양이 이기 때문에 이런 이름 을 지 었 습 니 다.
QRect*catImgRect;이 그림 의 사각형 정보 입 니 다.그림 이 이동 할 때 그림 의 x,y 좌표 의 값 이 바 뀌 고 사각형 정보 가 바 뀔 것 이 라 고 생각 합 니 다.그림 함수 에는 직사각형 정보 와 그림 포인터 에 따라 함 수 를 그 리 는 함수 가 있 습 니 다
painter.drawPixmap(*catImgRect,*catImg);
.
편 의 를 위해 catImgRect 로 이 정 보 를 저장 합 니 다.
그리고 shrinkMultiple;이것 은 그림 의 확대 배수 입 니 다.제 고양이 의 그림 이 좀 커서 그 를 좀 줄 였 습 니 다.물론 없 을 수 있 습 니 다.
이것 괜찮아요? speed;그림 이동 픽 셀 수
ok,다음은 mainwindow.cpp
 
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
shrinkMultiple(2),speed(10)
{
ui->setupUi(this);
catImg = new QPixmap(":/img/cat.jpg");
int width = catImg->width () / shrinkMultiple;
int height = catImg->height () / shrinkMultiple;
catImgRect = new QRect(10,10,width,height);
QRect rect = this->geometry ();
rect.setWidth (width*4);
rect.setHeight (height*4);
rect.setX (20);
rect.setY (50);
this->setGeometry (rect);
}
void MainWindow::paintEvent (QPaintEvent *event)
{
QPainter painter(this);
painter.drawPixmap(*catImgRect,*catImg);
}
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
}
void MainWindow::keyPressEvent(QKeyEvent *event)
{
int width = catImgRect->width ();
int height = catImgRect->height ();
switch(event->key ())
{
case Qt::Key_Left:
{

catImgRect->setX (catImgRect->x ()-speed);

break;
}
case Qt::Key_Right:
{
catImgRect->setX (catImgRect->x ()+speed);
break;
}
case Qt::Key_Down:
{
catImgRect->setY (catImgRect->y ()+speed);
break;
}
case Qt::Key_Up:
{
catImgRect->setY (catImgRect->y ()-speed);
break;
}
}
catImgRect->setHeight(height);
catImgRect->setWidth (width);
this->repaint ();

}
MainWindow::~MainWindow()
{
delete catImg;
delete catImgRect;
delete ui;
}
입 니 다.먼저 구조 함 수 를 보 세 요.그 중에서

catImg=new QPixmap(":/img/cat.jpg");
여 기 는 자원 파일 을 참조 합 니 다./img/cat.jpg,콜론 뒤의 첫 번 째 슬 래 쉬 는 방금 추 가 된 접두사 입 니 다.
다음 줄 은 고양이 의 그림 을 줄 이 고 고양이 의 사각형 정 보 를 초기 화 하 는 것 입 니 다.마지막 줄 은 프로그램 창 크기 를 고양이 그림 크기 의 4 배로 설정 하 는 것 입 니 다.
그림 함수 가 바로 paintEvent 라 는 함수 입 니 다.특별히 말 할 것 이 없습니다.이 함 수 는 창 이 다시 그리 기만 하면 호출 됩 니 다.
관건 적 인 이동 은 바로 재 작성

voidMainWindow::keyPressEvent(QKeyEvent*event)
이라는 함수 입 니 다.특별한 설명 이 없습니다.마지막 줄

this->repaint();
이 나 왔 습 니 다.키보드 가 누 르 면 창 을 다시 그립 니 다.이 함수 가 없 으 면 고양이 사각형 이 확실히 변 했 습 니 다.그러나 그림 의 위 치 는 변 하지 않 았 습 니 다.다시 그 릴 때 까지 기다 리 지 않 고 paintEvent 함 수 를 호출 합 니 다.언제 다시 그 렸 습 니까?이 부분 창 이 가 려 지고 최소 화 되 며 창 이 이동 할 때(있 을 수 있 습 니 다)repaint 함수 의 역할 은 바로 다시 그 리 는 것 이기 때문에 그림 이 바로 이동 할 수 있 습 니 다.
그림 이동 은 문제 가 없습니다.관건 은 유창 하지 않 습 니까?그 당시 MFC 를 사용 할 때 타이머 로 이 문 제 를 해결 하 는 것 이 었 습 니 다.Qt 에 도 타이머 가 있 었 습 니 다.다음 에 다시 연구 하 겠 습 니 다.그러나 문제 가 발생 할 수 있 습 니 다.바로 창 이 반 짝 이 는 문제 입 니 다.이 럴 때 더 블 버퍼 로 그림 을 그 리 는 기술 을 사용 해 야 합 니 다.
마지막 그림 을 붙이다


좋은 웹페이지 즐겨찾기