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 에 도 타이머 가 있 었 습 니 다.다음 에 다시 연구 하 겠 습 니 다.그러나 문제 가 발생 할 수 있 습 니 다.바로 창 이 반 짝 이 는 문제 입 니 다.이 럴 때 더 블 버퍼 로 그림 을 그 리 는 기술 을 사용 해 야 합 니 다.
마지막 그림 을 붙이다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Qt 그림 이동 인 스 턴 스 구현(그림 튜 토리 얼)관건 적 인 이동 은 바로 재 작성 이라는 함수 입 니 다.특별한 설명 이 없습니다.마지막 줄 이 나 왔 습 니 다.키보드 가 누 르 면 창 을 다시 그립 니 다.이 함수 가 없 으 면 고양이 사각형 이 확실히 변 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.