2010-06-18 4 views
0

QT4부터 시작하겠습니다. 응용 프로그램 코드를 어디에 넣어야할지 궁금합니다.
여기에?앱의 코드를 QT 앱에 넣을 위치는 어디입니까?

void MainWindow::changeEvent(QEvent *e) {...}

또는 여기에? (정확하게?)

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 
    w.show(); 
    return a.exec(); 
}

내 앱이 사용자 이벤트에 반응 할뿐만 아니라 루프에서 정기적으로 실행되기를 원한다면 어디에서 루프를 작성해야합니까?

+0

애플리케이션 코드에서 무엇을해야합니까? 왜 반복해야합니까? –

+0

에뮬레이터 용 시각적 디버거를 작성하려고합니다. 내 에뮬레이터에는 명령어를 가져와 실행하는 메서드가 있으며 루프에서 호출해야합니다. – Petruza

답변

2

비 GUI 스레드 내에서 루프하지 않는 한 루핑 (암시 적 메인 GUI 스레드에서)하여 GUI를 차단합니다. 여기에 몇 가지 접근법이 있습니다 :

  1. 스레드를 사용하십시오.. Qt의 신호와 슬롯은 스레드로부터 안전합니다. 따라서 스레드 내에서 에뮬레이터 (블록 될 수 있음)를 호출하고 호출 스레드로 데이터를 반환합니다. 그런 다음 신호에 응답 할 GUI 스레드로 신호를 내 보내어 그에 따라 GUI를 업데이트 할 수 있습니다.
  2. 타이머을 사용하십시오. 지연 시간이 0 밀리 초로 설정된 QTimer (또는 singleShot 타이머)을 사용할 수 있습니다. 이렇게하면 루프를 차단하지 않고 가능한 한 자주 슬롯을 호출하는 데 영향을 미칩니다. 슬롯이 빨리 돌아 오면 GUI를 차단하지 못하고 조금 프로그래밍이 간단 해집니다.

processEvents()을 사용하는 것과 같은 다른 접근 방식이 있지만 개인적으로 스레드 방식을 권장합니다.

2

Qt에는 자체 루프가 있으므로 QTimer 클래스를 사용하여 연결할 수 있습니다.

자신 만의 이벤트 루프를 제공하려는 경우 QApplication::processEvents()을 사용하여 이벤트 처리를 위해 Qt에 신호를 보내고 책임감있는 UI를 유지할 수 있습니다.

또한 QAbstractEventDispatcher이 유용 할 수 있습니다.

This 질문이 도움이 될 수도 있습니다.

관련 문제