2013-06-01 4 views
0

Qt의 QPixmap에 매우 이상한 문제가 있습니다. 저는 C++로 코딩하고 있습니다. 어쨌든 문제는, 메인 윈도우 클래스에서 9 번째 QPixmap 포인터를 생성하자마자 프로그램이 충돌한다는 것입니다.Qt QPixmap 포인터 제한

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 
    QPixmap *doorOpened, *doorClosed, *dirUp, *dirDown, *dirNone, *timePause, *timePlay, *timeStop; 
    //QPixmap *doorOpen; 
public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 
private: 
    Ui::MainWindow *ui; 
}; 

을이 충돌 : 그래서이 작품이 코드에 의해 짐작으로

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 
    QPixmap *doorOpened, *doorClosed, *dirUp, *dirDown, *dirNone, *timePause, *timePlay, *timeStop; 
    QPixmap *doorOpen; 
public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 
private: 
    Ui::MainWindow *ui; 
}; 

이 물건은 부분적으로 Qt는 창조주와 창 디자이너로 이루어집니다.

그래서이 이상한 행동을 일으키는 원인은 무엇입니까?

미리 감사드립니다.

+1

어떻게 충돌합니까? stderr에 오류가 있습니까? 자유롭게 공유해주세요 :) – bartimar

+0

@bartimar it segfaults. 어쨌든, QPixmap과 관련된 모든 것이 끝나면 생성자에서 가지고 있던 QTimer를 인스턴스화하여 문제를 해결했습니다. 이상한. –

+0

[ "암시 적 공유 클래스"] (http://qt-project.org/doc/qt-4.8/implicit-sharing.html#implicit-data-sharing)'QPixmap'은 이미 일종의 스마트 포인터입니다. 포인터와 함께 사용해서는 안됩니다. – alexisdm

답변

1

포인터를 초기화하거나 액세스하기 전에 모든 포인터를 생성자에서 먼저 0으로 초기화 해보십시오.

또한 QPixmap의 기능은 isNull()입니다. 이는 오류를 확인하는 데 유용 할 수 있습니다. 당신이 픽스맵의 기본 생성자 (doorOpen = new QPixmap();)를 사용하여 다음 사용하려는 파일 이름 load()를 호출하는 경우

은 또한, 오류 검사를 수행 할 load()의 반환 값을 확인 할 수 있습니다.

http://qt-project.org/doc/qt-4.8/qpixmap.html#isNull

http://qt-project.org/doc/qt-4.8/qpixmap.html#load

희망하는 데 도움이.

+0

빠른 답장을 보내 주셔서 감사합니다.하지만 문제는 사용하지 않더라도 충돌이 발생한다는 것입니다. 포인터 변수가 있으면 충돌이 발생합니다. –

+0

다른 포인터를 사용합니까? 네가하는 일은 프로그램을 망치는거야. bartimar가 이미 물었 듯이, 프로그램이 어떻게 충돌하고 어디에서? 디버거에서 프로그램을 실행 했습니까? –

+0

오 잘, 나는 문제를 발견했다. 어떤 이유로 든 나는 QTixer를 인스턴스화해야하는데, 나는 QPixmap과 관련된 모든 것이 끝나면 Mainwindow의 생성자에서 사용했다. 이유는 모르겠지만 지금은 효과가 있습니다. –