[완료] qt 에서 gif애니메이션을 QMovie로 구현하는 방법에 관해 궁금한게 있습니다.
글쓴이: pogusm / 작성시간: 토, 2011/06/18 - 2:28오전
사정상
gif파일(또는 리소스)을 QMovie로 직접 로드하는 대신에,
QByteArray 형태로 로드된 gif파일을 QMovie로 실행시키려 하였습니다.
1. 첫번째 시도 (이미지 잠깐 출력후, Segmentation fault 발생하면서 프로그램 다운)
QLabel *Movie = new QLabel(this); QFile f("./image01.gif"); QByteArray b; if (f.open(QFile::ReadOnly)) { b = f.readAll(); f.close(); } QBuffer buffer(&b); QMovie *mov = new QMovie(&buffer); Movie->setMovie(mov); Movie->setGeometry(20, 20, 392, 225); mov->start();
2. 두번째 시도 (Segmentation fault가 발생하지는 않지만, 이미지가 정지된 상태로 출력)
QLabel *Movie = new QLabel(this); QFile f("./image01.gif"); QByteArray b; if (f.open(QFile::ReadOnly)) { b = f.readAll(); f.close(); } QBuffer *buffer = new QBuffer(&b); QMovie *mov = new QMovie(buffer); Movie->setMovie(mov); Movie->setGeometry(20, 20, 392, 225); mov->start();
3. 세번째 시도 (정상적으로 이미지 출력 + 애니메이션 정상 작동)
QLabel *Movie = new QLabel(this); QFile f("./image01.gif"); QByteArray *b; if (f.open(QFile::ReadOnly)) { b = new QByteArray(f.readAll()); f.close(); } QBuffer *buffer = new QBuffer(b); QMovie *mov = new QMovie(buffer); Movie->setMovie(mov); Movie->setGeometry(20, 20, 392, 225); mov->start();
QByteArray b; 로 하느냐, QByteArray *b; 로 하느냐에 따라,
QBuffer buffer; 로 하느냐, QBuffer *buffer; 로 하느냐에 따라 결과가 달라지는데
그 원인은 무엇인가요?
수많은 삽질끝에 원하는 결과를 얻긴 하였지만..
왜 오류가 발생했었는지가 궁금합니다.
굽신굽신
Forums:
코드의 전후가 필요합니다.
코드의 전후가 필요합니다.
pointer를 인자로 받는 함수의 경우, 보통 해당 변수가 끝까지 살아있음이 보장되야 하는경우가 많습니다.
만약에 적으신 코드가 어떤 스코프안에 있어서 해당스코프를 벗어나서도 QMovie객체를 이용할려고 한다면, 스택에 있던 QFile객체나 QBuffer객체는 사라졌을 테니 문제가되겠지요.
qt 소스코드(압축파일)를 올려봅니다.. 한번 봐주세요
main.cpp
widget.h
widget.cpp
굽신굽신굽신굽신
이미 말씀드린대로 입니다. 스택에 생성된
이미 말씀드린대로 입니다. 스택에 생성된 QFile이나 QBuffer의 객체들은 해당 스코프안에서만 유효합니다.
그렇군요..
1. new 연산자로 힙영역에 동적 할당된 객체는 해당 스코프가 끝나도? 유지되기때문에 QMovie로 작동될 수 있는건가요?
2. new로 할당된건 따로 delete하지 않으면 해당스코프를 벗어나도 유지된다... 인건가요?
추가--
3. 위의 소스에서 QByteArray *b; 나 QBuffer *buffer는 delete되지 않기 때문에.. on_pushButton_reload_clicked() 를 여러번 실행한다면... 메모리 누수 가능성이 있는건가요?
위 소스코드를 수정한다면... QByteArray *b; 나 QBuffer *buffer 를 Widget클래스의 멤버변수로 선언해주는게 좋은 방법일까요?
답변 정말 감사합니다.
1. 네 2. 네 3. 메모리 누수가 될수 있습니다.
1. 네
2. 네
3. 메모리 누수가 될수 있습니다. 멤버변수로 선언하는게 베스트인지 어떤지는 상황에 따라 다르지만 그것도 하나의 해결책이 될수 있습니다.
댓글 달기