당신이 맞아요
#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
모듈이 없으면 코드가 컴파일되지 않고 이것이 지원되지 않는 작업을 시도하는 첫 번째 힌트 였을 것입니다.
QGraphicsScene
은 gui
모듈의 일부가 아니고 widgets
모듈의 일부입니다! 위젯 모듈의 모든 클래스는 QApplication
, 이 아닌QGuiApplication
을 인스턴스화 한 것으로 가정 할 수 있습니다. QTBUG-36413으로 제출했지만 놀랍지는 않습니다 - 유효하지 않은 것으로 마감되었습니다. 그것은 단순히 작동하지 않아야합니다. 당신이 QGuiApplication
를 사용하려면
는, 해결 방법있다 :
QApplication
(그러나 QGuiApplication
) 모든 그래픽 장면의 목록을 유지하고있다. QGraphicsScene
은 qApp
유형이 QApplication
이라고 가정합니다. 목록은 QGraphicsScenePrivate::init()
에 있습니다. 수정은 qApp
에 유형 검사와 scene_list
에 대한 참조를 보호하는 것입니다
if (qobject_cast<QApplication*>(qApp))
당신은 QGraphicsScenePrivate::init()
및 QGraphicsScene::~QGraphicsScene()
모두이 필요합니다. Qt를 다시 컴파일 한 후에 더 이상 충돌이 발생하지 않는다는 것을 확인했습니다.
심각한 점이 있다면 Qt 소스에서 관련 파일을 프로젝트로 복사하고 프로젝트 파일에서 widgets
모듈을 제거하고 작동 할 때까지 패치해야합니다. 개인적으로 나는 그것이 노력의 낭비라고 생각합니다. QGraphicsView
을 실제로 화면에 표시 할 필요없이 임의의 페인트 장치에 렌더링하는 것은 간단합니다.