2014-01-22 2 views
0

QtCreator를 사용하여 새로운 Qt 5 프로젝트를 만들고 다음 행을 추가했습니다. 에QGraphicsScene을 QtGui/QGuiApplication과 함께 사용하는 방법은 무엇입니까?

#include <QGraphicsScene>

// 주() : I가 추가 .PRO 파일에서
QGraphicsScene scene;

:
Qt += gui

QGraphicsScene의 개체 생성이 세그멘테이션 결함을 초래한다. 무슨 점이 있습니까?

편집 :


는 지금 실현 프로그램의 대신 QApplication 내 나머지 QtGui/QGuiApplication을 사용하고 있습니다.

QGraphicsScene을 QtGui/QGuiApplication과 함께 사용하는 방법은 무엇입니까? 이 Qt는 4.8과 5.2 모두 나를 위해 작동 QApplication와 함께,하지만 QGuiApplication로 :

답변

1

당신이 맞아요

#include <QApplication> 
#include <QGraphicsScene> 
#include <QTimer> 

int main(int argc, char ** argv) { 
    QApplication app(argc, argv); 
    // With QGuiApplication, QGraphicsScene constructor crashes. 
    QGraphicsScene scene; 
    QTimer::singleShot(1000, &app, SLOT(quit())); 
    return app.exec(); 
} 

당신은 코드가 바로 gui 모듈로 컴파일한다는 잘못된 것 프로젝트에 추가되었습니다. widgets 모듈이 없으면 코드가 컴파일되지 않고 이것이 지원되지 않는 작업을 시도하는 첫 번째 힌트 였을 것입니다.

QGraphicsScenegui 모듈의 일부가 아니고 widgets 모듈의 일부입니다! 위젯 모듈의 모든 클래스는 QApplication, 이 아닌QGuiApplication을 인스턴스화 한 것으로 가정 할 수 있습니다. QTBUG-36413으로 제출했지만 놀랍지는 않습니다 - 유효하지 않은 것으로 마감되었습니다. 그것은 단순히 작동하지 않아야합니다. 당신이 QGuiApplication를 사용하려면

는, 해결 방법있다 :

QApplication (그러나 QGuiApplication) 모든 그래픽 장면의 목록을 유지하고있다. QGraphicsSceneqApp 유형이 QApplication이라고 가정합니다. 목록은 QGraphicsScenePrivate::init()에 있습니다. 수정은 qApp에 유형 검사와 scene_list에 대한 참조를 보호하는 것입니다

if (qobject_cast<QApplication*>(qApp)) 

당신은 QGraphicsScenePrivate::init()QGraphicsScene::~QGraphicsScene() 모두이 필요합니다. Qt를 다시 컴파일 한 후에 더 이상 충돌이 발생하지 않는다는 것을 확인했습니다.

심각한 점이 있다면 Qt 소스에서 관련 파일을 프로젝트로 복사하고 프로젝트 파일에서 widgets 모듈을 제거하고 작동 할 때까지 패치해야합니다. 개인적으로 나는 그것이 노력의 낭비라고 생각합니다. QGraphicsView을 실제로 화면에 표시 할 필요없이 임의의 페인트 장치에 렌더링하는 것은 간단합니다.