2014-11-18 3 views
0

색상을 그리는 프로그램을 만들고 다른 클래스가이를 확인하고 일치하면 true를 반환합니다. 그 중 전체 코드는 대화 상자에 있습니다. colQ는 단순히 RGB 값 및 기타 항목을 저장하는 클래스입니다. 우리는 이것을 사용하여 RGB를 얻습니다.keyPressEvent에 충돌이 발생했습니다.

colDialog::colDialog(QWidget *parent) // etc.. 
{ 
    // initialization code 

    colQ.setColor(255, 0, 0); // red 
    r_ans = g_ans = b_ans = nullptr; 
} 

그러면 그림을 그리는 페인트 이벤트가 발생합니다. r1 및 br1은 각각의 클래스에 대한 포인터입니다.

void Atn_QDialog::paintEvent(QPaintEvent *e) 
{ 
    QPainter painter(this); 

    r1 = new QRect(100, 100, 175, 400); 
    br1 = new QBrush(QColor(colQ.getR, colQ.getG, colQ.getB)); 
    painter.fillRect(*r1, *br1); 
    painter.drawRect(*r1); 

    // other color code 
} 

이 시점에서 빨간색으로 그려지는 직사각형을 갖게됩니다. 지금하고 싶은 것은 사용자가 1과 같은 키를 누른 다음 colQ가 저장된 색상이 키가 눌러 진 사각형의 색상과 일치하는지 확인합니다.

void colDialog::keyPressEvent(QKeyEvent *Ev) 
{ 
    if (Ev->key() == Qt::Key_1) 
    { 
     br1->color().getRgb(r_ans, g_ans, b_ans); 
     colQ.answer(*r_ans, *g_ans, *b_ans); 

     if (colQ.isCorrect()) 
       ui->resultlabel->setText("correct!"); 
     else ui->resultlabel->setText("wrong!"); 
    } 

    // other key presses here 
    QDialog::keyPressEvent(Ev); 
} 

코드가 구현 된 곳에서 '1'키를 누르면 버그가 발생합니다. 이전에는 키를 누르면 정상적으로 응답하지만이 코드를 실행하면 응답하지 않습니다. Fyi, colQ는 Qt 코드가없고 코드를 생략하면 프로그램이 여전히 충돌을 일으 킵니다. 여기서 내가하는 일은 QBrush * 타입의 br에 저장된 색상을 얻고 싶습니다. getRgb (..)에 포인터를 전달 했으므로 요청한 것입니다. keyPressEvent (Ev)에서 코드가 효과적으로 충돌합니다. ui-> resultlabel->> setText ("...")와 같은 것은 프로그램이 키를 눌렀을 때 충돌을 일으키지 않습니다. 앞에서 언급 한 함수 호출에서만 발생합니다.

답변

1

여러분의 프로그램은 여기에 충돌 :

br1->color().getRgb(r_ans, g_ans, b_ans); 

r_ans, g_ansb_ans 초기화 할 필요가 메모리 그 포인터에 할당해야합니다. QColor::getRgb은 메모리를 할당하지 않고 단지 값을 변경하기 때문에 세그먼트 화 오류/액세스 위반으로 인해 충돌합니다. 생성자 내부

그 3 포인터에 메모리를 할당 :

colDialog::colDialog(QWidget *parent) // etc.. 
{ 
    // initialization code 

    colQ.setColor(255, 0, 0); // red 
    r_ans = new int; 
    g_ans = new int; 
    b_ans = new int; 
} 

당신이 nullptr이 당신이 그것을 역 참조하려고하는 경우 : int *p = nullptr; int x = *p; 프로그램이 충돌합니다. 이것은 QColor::getRgb 내부에서 일어나는 일입니다. 3 개의 포인터는 가리키는 값을 변경하기 위해 참조 해제되므로 응용 프로그램이 충돌합니다.

또한 끔찍한 당신은 당신이하고있는 일이있어 : paintEvent 내부

r1 = new QRect(100, 100, 175, 400); 
br1 = new QBrush(QColor(colQ.getR, colQ.getG, colQ.getB)); 

합니다. paintEvent 함수의 어딘가에서 메모리를 해제한다고하더라도 나쁜 생각입니다. r1을 스택에 선언하고 생성자에서 초기화하면 여기에 포인터가 필요하지 않습니다. 또한 스택에 br1을 만듭니다. 포인터와 동적 메모리 할당은 필요 없습니다.

+0

나는 생성자에서 nullptr에 대해 r_ans, g_ans 및 b_ans를 초기화했습니다. 코드가 작동하기에 충분하지 않습니까? – Poriferous

+0

@Vormeph 아니, 당신은 그들을 위해 메모리를 할당해야 내 편집을 참조하십시오. – Iuliu

+0

처음에는 작동하지 않았지만 나중에 포인터의 인라인 초기화를 중단하고 대답을 다른 함수로 옮겼습니다. 당신의 도움을 주셔서 감사합니다! – Poriferous

관련 문제