2017-04-17 6 views
0

QPainterPath를 그리는 QGraphicsScene이 있는데, 셰이프를 저장하고 응용 프로그램을 다시 실행할 때 다시 그릴 수 있어야합니다. 다음은 어떻게 모양, 단순화 된 버전 및 필기 방법을 그리는 것입니다.저장하고 다시 그리기 위해 셰이프를 serialize하십시오.

void drawPath(){ 
    QPoint p1 = QPoint(10, 20); 
    writePointsToFile(p1); 
    QPoint p2 = QPoint(25, 30); 
    writePointsToFile(p2); 
    QPoint p3 = QPoint(40, 60); 
    writePointsToFile(p3); 

    QPainterPath path; 
    path.moveTo(p1.x(), p1.y()); 
    path.lineTo(p2.x(), p2.y()); 
    path.lineTo(p3.x(), p3.y()); 
} 

void writePointsToFile(QPoint point){ 
    QFile file("../path.dat"); 
    file.open(QIODevice::WriteOnly); 
    QDataStream out(&file); 
    out << point; 
    file.close(); 
} 

현재 내 파일은 실행시 기록되지 않습니다.

그러나 모양을 다시 만들 수 있도록이 데이터를 serialize하는 올바른 방법은 무엇입니까?

다시 그리기를 처리 할 수있을 것이라고 생각했지만 직렬화를 충분히 이해하지 못했습니다.

포인트를 직렬화합니까? 포인트가 포함 된 목록?

포인트를 직렬화하면 역 직렬화 할 때리스트에 추가하고 목록의 각 포인트의 위치에 따라 모양을 다시 만들 수 있어야합니다. 예를 들어 위치 0의 점은 p1이되고 점 1은 p2가됩니다.하지만 어쨌든 파일에 아무 것도 쓰여지지 않기 때문에이 점을 얻을 수 없습니다. 게다가 처음부터 데이터의 직렬화에서 무엇을 기대해야하는지 잘 모르겠습니다.

이 문제에 대한 도움이 될 것입니다.

편집 :이 잘 컴파일

QFile file("../path.dat"); 
file.open(QIODevice::WriteOnly); 
QDataStream out(&file); 
QDataStream & operator << (QDataStream& file, const QPainterPath& path); 
out << path; 
file.close(); 

의견에 따라, 나는 지금 내가 그 권리를하고있어 완전히 확실하지 않다하더라도, 내 쓰기 방법이에 노력하고, 아무것도 기록되지되고있다 그래서 나는 어딘가에서 떨어져 있다고 가정합니다.

답변

3

Qt는 이미 필요한 사업자, 직렬화 및 역 직렬화하기 위해 제공하는 QPainterPath 직접 :

QDataStream & operator<<(QDataStream & stream, const QPainterPath & path) 
QDataStream & operator>>(QDataStream & stream, QPainterPath & path) 

그래서 복잡한 멀티를 포함한 경로의 정확한 내용을 직렬화 수있는 포인트를 직렬화 할 필요도 없다 구성 요소 경로.

그래서 패스를 파일에서 읽거나 파일에 쓸 수 있도록 영구 멤버 변수로 구현해야하며, 그리기 방법에서는 단순히 패스를 그립니다.

현재 내 파일은 실행시 기록되지 않습니다.

내 생각은 writePointsToFile()이 호출되지 않기 때문입니다. 파일 등을 열어 볼 때 오류가 있는지 확인하는 습관이 좋습니다. 또한 QIODevice::Append을 지정하지 않으므로 디스크에 쓰는 경우에도 이전의 모든 시간을 덮어 쓰면서 하나의 단일 지점 만 쓰게됩니다.

편집 : 편집 내용에 따라 편집자는 자신이 앞서 가고있는 것처럼 보이며 사용하기 시작하기 전에 기본 C++을 배워야합니다. 다음과 같이 시도해보고 잘못된 위치를 파악하십시오.

QPoint p1 = QPoint(10, 20); 
QPoint p2 = QPoint(25, 30); 
QPoint p3 = QPoint(40, 60); 

QPainterPath path; 
path.moveTo(p1.x(), p1.y()); 
path.lineTo(p2.x(), p2.y()); 
path.lineTo(p3.x(), p3.y()); 

QFile file("../path.dat"); 
if (!file.open(QIODevice::WriteOnly)) return; 
QDataStream out(&file); 
out << path; 
+0

감사합니다. 내 응용 프로그램에서 멤버 변수로 경로가 있습니다. File.exists()가 항상 true를 반환하는지 확인 중이므로 다른 문제 일 것이라고 생각했습니다. 사용 하시겠습니까? QFile 파일 ("../path.dat"); 파일open (QIODevice :: WriteOnly); QDataStream & 연산자 << (QDataStream & stream, const QPainterPath & path) ? – bauervision

+0

쓰기 위해서는'out << path;'를 사용하고 경로를 읽으려면'in >> path;'를 사용하십시오. – dtech

+0

해당 파일을 존재한다고해서 해당 작업을 수행 할 수있는 권한이 없기 때문에 파일을 열 수 있음을 의미하지는 않습니다. – eyllanesc