QT를 시작으로, 파트 II - 신호, 슬롯 및 타이머

2 월 1 일, 2008 · 안으로 배치 하는 C / C + + , Qt를

이 게시물에서 나는 게임의 Qt에 초보자를위한 작은 자습서를 만들기 위해 따라갔다. 이번엔 내가 어떻게 우리 자신의 신호와 슬롯과 방법을 타이머를 조작하기 위해 만드는 방법을 보여줍니다.

소스 코드는이에서 찾을 수 있습니다 링크 .

예제 프로그램은 클래스를 사용합니다 것입니다 타이머 QTime 하나 의 클래스의 주요 QT를하고, 클래스 것이다 디스플레이 디스플레이 스타일을 액정 계산기를 사용하여 시간을 QLCDNumber .

qt와 타이머

에의 Qt 타이머 지원은 가장 기본적인 방법을 제공하는 클래스입니다 QObject를 사용할에서 QObject : : StartTime () 와 QObject : : KillTimer () . 첫 번째 방법은 고유한 ID와 두 번째 타이머를 반환이 ID를 통해 타이머를 중지합니다.

이 일을하기 위해서는, 그러나,이 메커니즘을 사용하여 코드 발췌 문장은 "이벤트 루프"이내에해야합니다. 일단 타이머)를 초과 그것을 시작하는 시간부터 시간 (Dispater 만드는 응용 프로그램 을 QTimerEvent 의 이벤트가 처리되기 전까지는 프로그램의 흐름을 혼란 정상.

최대 초과, 그리고 제한되지 않습니다 년간의 시간 초과와 타이머를 만들 수 있습니다, 그러나, 최소한의 시간은 시스템에서 시스템 다를 수 있습니다. 리눅스 2.6.x이 구성되는 동안 윈도우 비스타의 최소 타이머가 10 석사 (기본값 4 미시시피)입니다. 시스템을 "은"흑자를 삭제됩니다 허용하지 않는 경우 Qt는 모든 이벤트를 전달하기 위해, 같은 요청하지만, 시도합니다.

타이머는 또한 스레드에서 사용할 수 있지만 이벤트 루프 내부되는 요구 사항을 충족해야합니다. 스레드는 항상 별도의 문서를, 자격 ...

클래스는 QTime 기능을 일부 구현하는 타이머가 높을 수 있도록 수준. 하나는 QTime : singleShot () , 어느 한 이벤트를 트리거합니다.

읽고 광범위한 문서와 반복은 지루하지만, 날 믿어, 당신은 QDorDeCabeca 많은 저장됩니다 ...

신호와 슬롯 추가에

신호와 슬롯이 객체 사이의 통신에 사용되는 하나의 QT를 keystones 있습니다. 이 시스템보다는 콜백 이벤트를 처리하는 구현에서는, 프로그래밍이 더 직관적인 제작 슬롯에 신호를 연결하는 개념을 사용합니다.

신호와 슬롯에 의해 처리됩니다 방식 클래스 메타 - 객체 컴파일러 (MOC) 컴파일하기 전에 소스되는 코드는. 그들은 표준 C + +의 일부가 아닌 특별한 진술을하기 때문에 MOC Fazuma 구문 분석하고 소스 코드 compilable 생성합니다.

신호와 슬롯, 소스 코드의 일정 금액을 구현하는 모든 클래스에 MOC 명령을 실행하여 생성됩니다. 프로그램 사용은 QMake을 , 해당 프로그램에 전화를 MOC를 만드는, 의해 부담 Makefile을 프로그래머가 그것 투명합니다.

클래스의 슬롯을하고 있습니다 구현 신호, 그것에 대한 액세스를 필요로 메타 객체 시스템 . 그럼 클래스 상속해야합니다 QObject 또는 그 하위 클래스와 매크로가 필요 Q_OBJECT를 지역에서 그들의 선언 사설. 완료 준비가 신호를 슬롯에있는 선언 "에 섹션 신호"절에 "[공개"는 슬롯] 보호 | 사설 |.

슬롯은 후, 그때 명시적으로 다른라고도 불린다 수있는 다른 일반적인 방법으로 정의됩니다 선언했다. 이미 징후가 좀 더 섬세하고 오직 선언과 프로그래머에 의해 정의됩니다. 그 이유는? 구축을 위해 노력 끝에이 메시지 :

 tmp를 / moc_mydisplay.o : 함수에서`MyDisplay : signalPlay () ':
 ~ / 스톱워치는 / tmp / moc_mydisplay.cpp : MyDisplay`89 : 여러 정의 : signalPlay () '
 tmp를 / mydisplay.o : ~ / 스톱워치 / mydisplay.cpp : 169 : 먼저 여기에서 정의
 collect2가 : 신분증 1 종료 상태를 반환
 확인 : ** [스톱워치 오류 [1]

코드 내부에 다음 moc_mydisplay.cpp 파일이 생성 :

  / / 0 신호를
 signalPlay ( ) MyDisplay 무효가 : signalPlay ()을
 (
     activate ( this , & staticMetaObject , 0 , 0 ) ; QMetaObject 정보 : :) 활성화 (이, & staticMetaObject, 0, 0;
 ) 

네, MOC은 Qt의 방법 메타 호출의 정의로 신호를 생성합니다. 따라서, 기호의 시체를 정의 쿼트에 불법이며 재설정하는 방법에 대한 컴파일 오류를 생성합니다. MOC 보이는합시다 당신을 위해 신호의 실시 후.

연결

소용 없어 그냥 신호와 슬롯을 정의할 수있어. 우리는 그들이 어떻게 상호 작용 정의해야합니다. 방법은이 일을하는 후계자가 모든 존재를 통해 연결 () 메서드에 의해 그들을 연결하는 QObject . 이 될 것이라 생각 MOC 너무 (들) 슬롯 (들) (들)와 동일한 매개 변수와 함께 연결하기 위해 호출에 대한 호출 결과가 그 신호를 구현합니다.

연결에 따라 신호에도 동일한 값을 마지막 슬롯에 다시 전화로 돌아갈 수 있습니다. 이것은 매우 신호를 여러 슬롯, 따라서, 보장 호출의 순서에 연결된 안전하지 않습니다.

주어진 신호가 두 번째 신호에 직접 연결할 수 있습니다. 첫 번째 신호) 방출가 (이후 두번째로 방출 ()에 다음 상응하는 신호, MOCs을의 만드는 단계 후, 등등 연결된 다른 메서드 호출 결과에, 전화에 전화 먼저 검색 결과에서 두 번째로 .

가지 방법으로 연결하는

거기서 발견하는 기본적으로 가지 방법과 신호에 연결할 슬롯을하기 어려울 경우에는 몹시 버그 제대로 사용하지 않을 수 수의 소스. 의 연결 형태는 이러한 방법) (연결하는 통과로 여분의 매개 변수입니다. 그들은 위치 :

직접 연결 :이 슬롯이 발급되었고 라 불리는 바로 신호가 스레드에 신호가 발행되었습니다. 슬롯에 직접 전화로이 역할을합니다.

대기중인 연결 : 신호가 호출하는 것입니다 보낸 슬롯과하지의 내부 목록에 간다 QT를하고, 신호를 반환 즉시 관계없이되어 슬롯 전화 또는. 이벤트 루프가 다음에만 저장 슬롯이 슬롯 개체가있는 스레드에서 호출됩니다 목록을 처리합니다.

자동 연결 :이 연결되는 기본 유형의 사용 유형을 지정하지 때. 그것은 하나 의 씨앗 이블 "" 스레드에 있기 때문에이 같은 선물을 두 개의 별개의 행동을 :면에있는 신호와 슬롯, 직접 연결 동작으로하지만, 그렇지 않으면 연결을 작동 대기합니다.

대기중인 연결이 차단 : 이봐!? 있었뿐 아니라 세? 글쎄, 그건 하나의 장점은이 문서를 읽을 수 있어요 : 당신이 문서 모순된하기! 이 연결을 제외하고 큐에 연결과 유사한 신호 스레드가 신호까지 제대로 실행될 차단이다. 그것은 매우 신중하게 사용해야하고 신호와 슬롯 서로 다른 쓰레드에 있습니다. 오용은 또한 교착 상태를 일으킬 수 있습니다. 당신은 당신이 이런 걸 보면 알아 :

 사용자 @ 호스트 : ~ / $을 스톱워치. / 스톱워치
 BlockingQueuedConnection를 활성화하는 동안 Qt가 : 죽은 감지 잠금 : 발신자입니다
 QPushButton은 (0x807e2d8) 수신기 MyDisplay (0x8076ac0)입니다

의미하려면 구문에 대해 해결을 의심 ""스레드는 개체가 QT를 설명서를 볼 수의 스레드에 있음 존중합니다.

항상 신호와, 타이머 및 스레드를 슬롯을 잘 돌봐. 이들은 Qt의 핵심 기능을하지만, 그것의 오용 버그 매우 찾을 어려운으로 이어질 수 있습니다. 그것에 대해 모든 설명서를 참조하십시오.

소스 다운에

우리의 예제는 두 개의 클래스와 MyDisplay 스톱워치 파일과 주요 정책 구성되어 있습니다. 주요 유일한 QApplication 개체 스톱워치를 만듭니다. 클래스는 MyDisplay 프로그램의 시각적 부분을, 버튼과 LCD 디스플레이 스타일이있는 대화로 이루어진 처리합니다. 스톱워치 클래스는 도구를 표시하고 타이머를 구현 생성됩니다. 이 아키텍처가 가장 elegent되지 않으며 그 이상의 클래스를 만들기 위해 관심을 참고 MyDisplay 스톱워치에서 상속합니다. 하지만 그것은 플레이를 거의 필요가 신호와 슬롯을 사용하여 제거 없잖나.

신호의 사용과 슬롯은 분명 우리가 객체가 외부와 대화하고 싶어집니다. 일반적으로 수업은 뭐가 뭔지 모르는 그들의 아웃. 외부 개체에 포인터를 전달 이내에, 그것은 패키지를 아파와 코드가 덜 일반 있습니다. 우리의 예제에서 더 재미있는가 신호를 사용하고 슬롯 스톱워치 내부 개체 myDisplay (입니다))에 이벤트와 스톱워치 개체 (외부 Mydisplay에서 의사 소통을하지 않고이 일반 또는 캡슐 속에서 길을 잃을 수 있습니다.

나는 그것을 말할 것이다 다른 문서에 나와있는 Qt 디자이너 (의 도움으로)으로, 전 대화 상자, 버튼과 액정을 만들었습니다. 단순화된 코드를 후에 우리의 목적에 맞게. QObject에서 QDialog부터 myDisplay 상속이 간접적으로 상속, 신호와 슬롯을 사용하는 방법 충분히 클래스 선언의 전용 섹션에 Q_OBJECT 매크로를 추가했습니다. 그 후, 다른 부수적인 방법들 사이 말했다 :

  공용 슬롯 :
     long ) ; 무효의 slotDisplayValue (길이);

 개인 슬롯 :
     slotPlay) 무효 (;
     slotStop 무효 ();

 신호 :
     signalPlay) 무효 (;
     signalPause 무효 ();
     signalStop 무효 ();
     signalReset 무효 (); 

신호가 외부 이벤트를 버튼을 클릭에 관련된 통신합니다. 대중이 외부에서 오는 진드기 타이머의 가치를받을 수있는 동안 이미 개인 슬롯, 사전 처리 절차를 만들 것입니다. 그러므로 클래스가 외부로 정보를 전송하고 외부에서, 어떻게 다른쪽에있는지를 아는없이 정보를받습니다. 늙은 인터페이스 계약에 의해 좋아.

  공용 슬롯 :
     slotPlay) 무효 (;
     slotPause 무효 ();
     slotStop 무효 ();
     slotReset 무효 ();

 개인 슬롯 :
     slotTick 무효 ();

 신호 :
     long ) ; 무효의 signalTicks (길이); 

아날로그 및 반대 스톱워치 클래스는 클래스 MyDisplay 신호를 수신 슬롯을 구현 및 일반 대중의 슬롯에 정보를 보내는 신호를 선언한다.

그것은 또한 우리의 친구 lerdinhos를 따라 수 있도록 매 10 밀리초 (화재 것입니다 QTime를 구현 비스타!), 카운터를 증가. 이 카운터가 다시 표시 형식과 표시로 전송됩니다.

타이머가 멈출 수있는, 일시 중지하고 해당 버튼을 클릭하여 언제든지 재개.

Finalmentes

사건 자체가 코드를 많이 가지고 있지만 타이머 및 사용자 정의 신호와 슬롯 건설의 가장 기본적인 사용을 보여줍니다. 그들은 치명적인 함정이 될 수 있기 때문에 특별한주의 그러나, 세부 이러한 자원의 사용에 관련된 부여해야합니다.

중요 링크

신호와 슬롯
QTime
쿼트에서 Threads
의 쿼트 설명서 온라인

댓글

  • 루카스
    네, 그래픽 솔루션 수학 함수에 관련된 사인 및 코사인 예를 들어 같은 찾고 있어요.

    내 말은, 어떤 버전의 Qt과 QWT의 사용 알고 싶어 QWT 문제가 문제가 설정하지만 잘 모르겠다고 생각하는거야?

    내가려고 그런 당신은 이미 뭔가를 완료했다면 내게 감사해야된다니까 도와 줄 수 있습니다.

    귀하의 관심에 감사드립니다

    인사
  • 안녕 루크,

    저는 귀하의 질문에 이해가 안 돼요.

    당신이 그래픽 솔루션 수학 함수에 관련된 찾으세요? 않는다 QWT 도와 드릴까요?

    물건 더 뭐가 필요 상세하게 계산 사이에.

    포옹
  • 루카스
    그것의 아주 좋은 설명은 잘도 상세한!
    혹시 그래픽 프로그램을 수학 함수의 예제를 공유 해 봤어요?
    제 생각엔이 아니니까!
    관심 가져 주셔서 감사합니다
  • 로드리고
    이봐, 당신은 짐승은, 당신의 자습서, 안아주고 고마워 사랑해!
  • Blaber

    나는 진심으로 관객을 감사하고 더 많은 도움을 바랍니다.

    나의 감사와 포옹.

  • Walison
    아주 좋은 텍스트, 난 이미 정기적으로 더 많은 Qt4 약 물론 전 조사이고 설명서를 읽고 알고 블로그를 방문입니다.

    AT & T는
블로그 Disqus에 의해 제공 코멘트