Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ сигналы ΠΈ слоты Π² qt

Π‘ΠΈΠ³Π½Π°Π»Ρ‹ ΠΈ слоты Π² Qt

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ графичСского интСрфСйса, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ мСняСм ΠΎΠ΄ΠΈΠ½ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚, ΠΌΡ‹ часто Ρ…ΠΎΡ‚ΠΈΠΌ Ρ‡Ρ‚ΠΎ Π±Ρ‹ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» ΠΎΠ± этом ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС, ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ любого Ρ‚ΠΈΠΏΠ° ΠΌΠΎΠ³Π»Π° ΠΎΠ±Ρ‰Π°Ρ‚ΡŒΡΡ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ. НапримСр, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ½ΠΎΠΏΠΊΡƒ Π—Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ, ΠΌΡ‹ вСроятно Ρ…ΠΎΡ‚ΠΈΠΌ Ρ‡Ρ‚ΠΎ Π±Ρ‹ Π±Ρ‹Π»Π° Π²Ρ‹Π·Π²Π°Π½Π° функция ΠΎΠΊΠ½Π° close().
Π”Ρ€ΡƒΠ³ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π΄ΠΎΠ±ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° общСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ². ΠžΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² это ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Ρ‡Ρ‚ΠΎ Π±Ρ‹ функция ΡƒΠ²Π΅Π΄ΠΎΠΌΠΈΠ»Π° нас ΠΎ ΠΊΠ°ΠΊΠΈΡ…-Π½ΠΈΠ±ΡƒΠ΄ΡŒ событиях, ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ (ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ) этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Ѐункция Π² Ρ‚Π°ΠΊΠΎΠΌ случаС Π΄Π΅Π»Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ. ΠžΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π° основных нСдостатка. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΎΠ½ Π½Π΅ являСтся типобСзопасным. ΠœΡ‹ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹ Ρ‡Ρ‚ΠΎ функция Π΄Π΅Π»Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² с ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² ТСстко связан с Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ эта функция Π΄ΠΎΠ»ΠΆΠ½Π° Ρ‚ΠΎΡ‡Π½ΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Π½Π°Π΄ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ.

Π‘ΠΈΠ³Π½Π°Π»Ρ‹ ΠΈ слоты

Π’ Qt ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ другая Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° β€” сигналы ΠΈ слоты. Π‘ΠΈΠ³Π½Π°Π» вырабатываСтся ΠΊΠΎΠ³Π΄Π° происходит ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ событиС. Π‘Π»ΠΎΡ‚ это функция, которая вызываСтся Π² ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ сигнал. Π’ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ Qt ΠΈΠΌΠ΅ΡŽΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… сигналов ΠΈ слотов, Π½ΠΎ ΠΌΡ‹ всСгда ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ класс ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ наши сигналы ΠΈ слоты Π² Π½Π΅ΠΌ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ сигналы ΠΈ слоты Π² qt. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ сигналы ΠΈ слоты Π² qt. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ сигналы ΠΈ слоты Π² qt. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ сигналы ΠΈ слоты Π² qt. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ сигналы ΠΈ слоты Π² qt

ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сигналов ΠΈ слотов типобСзопасСн. Π‘ΠΈΠ³Π½Π°Ρ‚ΡƒΡ€Π° сигнала Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ с сигнатурой слота-получатСля. (ЀактичСски слот ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΡƒΡŽ сигнатуру Ρ‡Π΅ΠΌ сигнал ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹). Π’Π°ΠΊ ΠΊΠ°ΠΊ сигнатуры сравнимы, компилятор ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π½Π°ΠΌ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ нСсовпадСниС Ρ‚ΠΈΠΏΠΎΠ². Π‘ΠΈΠ³Π½Π°Π»Ρ‹ ΠΈ слоты слабо связаны. Класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ сигнал Π½Π΅ Π·Π½Π°Π΅Ρ‚ ΠΈ Π½Π΅ заботится ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ слоты Π΅Π³ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚. ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сигналов ΠΈ слотов Qt Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Ссли ΠΌΡ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠΌ сигнал ΠΊ слоту, слот Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ сигнала Π² Π½ΡƒΠΆΠ½ΠΎΠ΅ врСмя. Π‘ΠΈΠ³Π½Π°Π»Ρ‹ ΠΈ слоты ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ любоС число Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² любого Ρ‚ΠΈΠΏΠ°. Они ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ типобСзопасны.
ВсС классы, наслСдуСмыС ΠΎΡ‚ QObject ΠΈΠ»ΠΈ Π΅Π³ΠΎ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… классов (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, QWidget) ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ сигналы ΠΈ слоты. Π‘ΠΈΠ³Π½Π°Π»Ρ‹ Π²Ρ‹Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ своС состояниС Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ это ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. ΠŸΡ€ΠΈ этом ΠΎΠ½ Π½Π° Π·Π½Π°Π΅Ρ‚ ΠΈ Π½Π΅ заботится ΠΎ Ρ‚ΠΎΠΌ Ρ‡Ρ‚ΠΎ Ρƒ Π΅Π³ΠΎ сигнала ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ получатСля.
Π‘Π»ΠΎΡ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ для получСния сигналов, Π½ΠΎ ΠΎΠ½ΠΈ Ρ‚Π°ΠΊ ΠΆΠ΅ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹. Π’Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ Π·Π½Π°Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΎ получатСлях своих сигналов, слот Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ‚ ΠΎ сигналах, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊ Π½Π΅ΠΌΡƒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹. Π­Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ нСзависимыС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ созданы с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Qt.
ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ слоту ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ сигналов, сколько Π·Π°Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ΄ΠΈΠ½ сигнал ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΊ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΈΠΌ слотам, сколько Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ. Π’Π°ΠΊ ΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ сигнал ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ сигналу (это Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ Π²Ρ‹Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ сигнала Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ послС появлСния ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ).
Π‘ΠΈΠ³Π½Π°Π»Ρ‹ ΠΈ слоты вмСстС ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΌΠΎΡ‰Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ создания ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ².

НСбольшой ΠΏΡ€ΠΈΠΌΠ΅Ρ€

ΠšΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°

ΠœΠ΅Ρ‚Π°-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ компилятор (meta-object compiler, moc) просматриваСт описаниС классов Π² Ρ„Π°ΠΉΠ»Π°Ρ… исходных ΠΊΠΎΠ΄ΠΎΠ² ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄ Π½Π° C++, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΌΠ΅Ρ‚Π°-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. ΠœΠ΅Ρ‚Π°-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ содСрТат ΠΈΠΌΠ΅Π½Π° всС сигналов ΠΈ слотов, Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.
Запуская ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ moc для описания класса, содСрТащСго сигналы ΠΈ слоты, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ„Π°ΠΉΠ» исходных ΠΊΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ скомпилирован ΠΈ слинкован с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ прилоТСния. ΠŸΡ€ΠΈ использовании qmake, ΠΏΡ€Π°Π²ΠΈΠ»Π° для автоматичСского Π²Ρ‹Π·ΠΎΠ²Π° moc Π±ΡƒΠ΄ΡƒΡ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π² Makefile ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Π‘ΠΈΠ³Π½Π°Π»Ρ‹

Π‘ΠΈΠ³Π½Π°Π»Ρ‹ Π²Ρ‹Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ своС состояниС Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ это ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. Волько класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт сигнал ΠΈΠ»ΠΈ Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ сигнал.
Когда сигнал вырабатываСтся, слот, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΎΠ½ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ выполняСтся Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹. Когда это происходит, ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сигналов ΠΈ сигналов ΠΈ слотов ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ нСзависим ΠΎΡ‚ любого Ρ†ΠΈΠΊΠ»Π° событий графичСского интСрфСйса. Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π·Π° выпуском сигнала ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ сразу послС Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· всСх слотов. Битуация слСгка отличаСтся ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ соСдинСния (queued connections); Π² этом случаС ΠΊΠΎΠ΄ послС ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова emit ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, Π° слоты Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ ΠΏΠΎΠ·ΠΆΠ΅.
Если нСсколько слотов ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ сигналу, слоты Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ ΠΎΠ΄ΠΈΠ½ Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΌ порядкС послС Π²Ρ‹Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сигнала.
Π‘ΠΈΠ³Π½Π°Π»Ρ‹ автоматичСски Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ moc ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² исходном ΠΊΠΎΠ΄Π΅. Они ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Ρ‚. Π΅., ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ‚ΠΈΠΏ void).
Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²: ΠΎΠΏΡ‹Ρ‚ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ сигналы ΠΈ слоты Π»Π΅Π³Ρ‡Π΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ написании ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Ссли ΠΎΠ½ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ². НапримСр, Ссли Π±Ρ‹ сигнал QScrollBar::valueChanged() использовал Π±Ρ‹ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π²Ρ€ΠΎΠ΄Π΅ гипотСтичСского QScrollBar::Range, ΠΎΠ½ ΠΌΠΎΠ³ Π±Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ слотам, спроСктированным ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для Π½Π΅Π³ΠΎ.

Π‘Π»ΠΎΡ‚Ρ‹

Π‘Π»ΠΎΡ‚ вызываСтся ΠΊΠΎΠ³Π΄Π° вырабатываСтся сигнал, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ½ связан. Π‘Π»ΠΎΡ‚ это обычная функция Π² C++ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ способом; СдинствСнная Π΅Π³ΠΎ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ с Π½ΠΈΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡΡ‚ΡŒ сигналы.
Π’Π°ΠΊ ΠΊΠ°ΠΊ слоты это Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹, ΠΎΠ½ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ C++ ΠΏΡ€ΠΈ прямом Π²Ρ‹Π·ΠΎΠ²Π΅. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΊΠ°ΠΊ слоты, ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Ρ‹ Π»ΡŽΠ±Ρ‹ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ, нСзависимо ΠΎΡ‚ ΠΈΡ… ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ доступа, Ρ‡Π΅Ρ€Π΅Π· соСдинСниС сигнал-слот. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ сигнал, Π²Ρ‹Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ класса ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΉ (private) слот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° нСсвязанного с Π½ΠΈΠΌ класса.
Π‘Π»ΠΎΡ‚Ρ‹ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ, Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° Π±Ρ‹Π²Π°Π΅Ρ‚ довольно ΡƒΠ΄ΠΎΠ±Π½ΠΎ.
По ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΌΠΈ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ, сигналы ΠΈ слоты слСгка ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ ΠΈΠ·-Π·Π° ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ гибкости, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚, хотя Ρ€Π°Π·Π½ΠΈΡ†Π° для Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π΅Π·Π°ΠΌΠ΅Ρ‚Π½Π°. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, Π²Ρ‹Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сигнала, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΊ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слотам, Π² срСднСм Π² 10 Ρ€Π°Π· ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, Ρ‡Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ² получатСля Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Π½Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π­Ρ‚ΠΈ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ для нахоТдСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, для бСзопасного ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° всСх Π΅Π³ΠΎ соСдинСний (Ρ‚. Π΅. ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‡Ρ‚ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ Π±Ρ‹Π» ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ Π²ΠΎ врСмя выпуска сигнала) ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π»ΡŽΠ±Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² ΠΎΠ±Ρ‰Π΅ΠΌ Π²ΠΈΠ΄Π΅. Π₯отя Π²Ρ‹Π·ΠΎΠ² дСсяти Π½Π΅Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π΄ΠΎΡ€ΠΎΠ³ΠΈΠΌ, это ΠΌΠ΅Π½Π΅Π΅ Π·Π°Ρ‚Ρ€Π°Ρ‚Π½ΠΎ, Ρ‡Π΅ΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, опСрация создания ΠΈΠ»ΠΈ удалСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Пока ΠΌΡ‹ создаСм строку, Π²Π΅ΠΊΡ‚ΠΎΡ€ ΠΈΠ»ΠΈ список, Ρ‡Ρ‚ΠΎ нСявно Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ созданиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ сигналов ΠΈ слотов ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‚ Π·Π° ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ°Π»Π΅Π½ΡŒΠΊΡƒΡŽ долю Π² Π·Π°Ρ‚Ρ€Π°Ρ‚Π°Ρ… срСди всСх Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€.
Π’ΠΎ ΠΆΠ΅ самоС Π²Π΅Ρ€Π½ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹ систСмный Π²Ρ‹Π·ΠΎΠ² Π² слот ΠΈΠ»ΠΈ косвСнно Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ Π±ΠΎΠ»Π΅Π΅ дСсяти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. На i586-500, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠΊΠΎΠ»ΠΎ 2,000,000 сигналов Π² сСкунду, соСдинСнных с ΠΎΠ΄Π½ΠΈΠΌ слотом ΠΈΠ»ΠΈ 1,200,000 Π² сСкунду, ΠΏΡ€ΠΈ соСдинСнии Π² двумя слотами. ΠŸΡ€ΠΎΡΡ‚ΠΎΡ‚Π° ΠΈ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° сигналов ΠΈ слотов ΠΎΠΊΡƒΠΏΠ°Π΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π΄Π°ΠΆΠ΅ Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚.
Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ signal ΠΈΠ»ΠΈ slot, ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ прСдупрСТдСния ΠΈΠ»ΠΈ ошибки компилятора ΠΏΡ€ΠΈ компиляции вмСстС с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ, написанной Π½Π° Qt. Π§Ρ‚ΠΎ Π±Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π΄Π°Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΡˆΠ°ΡŽΡ‰Π΅Π³ΠΎΡΡ символа прСпроцСссора с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ #undef.

ΠœΠ΅Ρ‚Π°ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Π°Ρ информация

Π Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Π‘Π»ΠΎΡ‚Ρ‹ это Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ для получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± измСнСниях состояний Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ². LcdNumber ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΈΡ…, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΊΠΎΠ΄Π΅ Π²Ρ‹ΡˆΠ΅, для установки ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠ³ΠΎ числа. Π’Π°ΠΊ ΠΊΠ°ΠΊ функция display() Ρ‡Π°ΡΡ‚ΡŒ интСрфСйса класса с ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ, этот слот ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ.
Π‘Ρ‚ΠΎΠΈΡ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ функция display() ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π°. Qt Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΡΡ‰ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ ΠΏΡ€ΠΈ соСдинСнии сигнала ΠΈ слота. Π‘ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΌ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Π½Π°ΠΌ Π±Ρ‹ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΏΡΡ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π½ ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ.
НСкоторыС Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹ Π±Ρ‹Π»ΠΈ ΠΎΠΏΡƒΡ‰Π΅Π½Ρ‹ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.

ΠŸΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚ΠΎΠ΅ использованиС сигналов ΠΈ слотов

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ОглавлСниС

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

ΠŸΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ графичСского интСрфСйса ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΌΡ‹ часто Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΈΠΌ элСмСнтам ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… элСмСнтов управлСния. Π‘ΠΎΠ»Π΅Π΅ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ связь ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Π»ΡŽΠ±Ρ‹Ρ… Π²ΠΈΠ΄ΠΎΠ². НапримСр, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ½ΠΎΠΏΠΊΡƒ Close ΠΌΡ‹, вСроятно, Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»Π° Π²Ρ‹Π·Π²Π°Π½Π° функция ΠΎΠΊΠ½Π° close().

Π‘ΠΈΠ³Π½Π°Π»Ρ‹ ΠΈ слоты

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ сигналы ΠΈ слоты Π² qt. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ сигналы ΠΈ слоты Π² qt. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ сигналы ΠΈ слоты Π² qt. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ сигналы ΠΈ слоты Π² qt. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ сигналы ΠΈ слоты Π² qt

Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ типобСзопасСн: сигнатура сигнала Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ сигнатурС ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π΅Π³ΠΎ слота. (ЀактичСски, слот ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΡƒΡŽ сигнатуру, Ρ‡Π΅ΠΌ сигнал, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ лишниС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹.) Π‘ΠΈΠ³Π½Π°Π»Ρ‹ ΠΈ слоты связаны Π½Π΅ Тёстко: Класс, ΠΈΡΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠΉ сигналы, Π½Π΅ Π·Π½Π°Π΅Ρ‚ ΠΈ Π½Π΅ интСрСсуСтся, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ· слотов ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ сигнал. ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сигналов ΠΈ слотов Qt Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ, Ссли Π’Ρ‹ соСдинили сигнал со слотом, слот Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ сигнала Π² Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚. Π‘ΠΈΠ³Π½Π°Π»Ρ‹ ΠΈ слоты ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ любоС количСство Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π»ΡŽΠ±Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ². Они ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ типобСзопасны.

ВсС классы, наслСдуСмыС ΠΎΡ‚ QObject ΠΈΠ»ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π΅Π³ΠΎ подклассов (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, QWidget) ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ сигналы ΠΈ слоты. Π‘ΠΈΠ³Π½Π°Π»Ρ‹ ΠΈΡΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ своСго состояния, Ссли это ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ интСрСсно Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ. ВсС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π΄Π΅Π»Π°ΡŽΡ‚ это для связи с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ. Π˜Ρ… Π½Π΅ Π·Π°Π±ΠΎΡ‚ΠΈΡ‚, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π»ΠΈ ΠΊΡ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ испускаСмыС ΠΈΠΌΠΈ сигналы. Π­Ρ‚ΠΎ являСтся истинной инкапсуляциСй ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΈ ΠΎΠ½Π° Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния.

Π‘Π»ΠΎΡ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ сигнал, Π½ΠΎ ΠΎΠ½ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±Ρ‹ΠΊΠ½ΠΎΠ²Π΅Π½Π½Ρ‹ΠΌΠΈ функциями-Ρ‡Π»Π΅Π½Π°ΠΌΠΈ. Π’Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ Π·Π½Π°Π΅Ρ‚, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π»ΠΈ ΠΊΡ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ сигналы, испускаСмыС ΠΈΠΌ, слоты Π½Π΅ Π·Π½Π°ΡŽΡ‚, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π»ΠΈ сигналы, с Π½ΠΈΠΌΠΈ связанныС. Π­Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ нСзависимыС Qt ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ слоту ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ сигналов, сколько Π²Π°ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Π½ΡƒΠΆΠ½ΠΎ, ΠΈ ΠΎΠ΄ΠΈΠ½ сигнал ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ соСдинСн со ΡΡ‚ΠΎΠ»ΡŒΠΊΠΈΠΌΠΈ слотами, сколько Π²Π°ΠΌ трСбуСтся. Π”Π°ΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ сигнал нСпосрСдствСнно с Π΄Ρ€ΡƒΠ³ΠΈΠΌ сигналом. (Π’Ρ‚ΠΎΡ€ΠΎΠΉ сигнал Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° испускаСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ.)

ВмСстС сигналы ΠΈ слоты ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΠΌΠΎΡ‰Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π½ΠΎΠ³ΠΎ программирования.

НСбольшой ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Минимальная дСкларация класса C++ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

НСбольшой класс, основанный Π½Π° QObject, ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

ВСрсия класса, основанная Π½Π° QObject, ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎ ΠΆΠ΅ самоС Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ состояниС ΠΈ прСдоставляСт ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для доступа ΠΊ Π½Π΅ΠΌΡƒ, Π½ΠΎ Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ этому ΠΎΠ½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ с использованиСм сигналов ΠΈ слотов. Π­Ρ‚ΠΎΡ‚ класс, испустив сигнал valueChanged(), ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ Π²ΠΎΠ²Π½Π΅, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ состояниС измСнилось, ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ слот, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡΡ‹Π»Π°Ρ‚ΡŒ сигналы.

ВсС классы, содСрТащиС сигналы ΠΈ слоты, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ макрос Q_OBJECT Π² Π½Π°Ρ‡Π°Π»Π΅ своСй Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ. Π’Π°ΠΊΠΆΠ΅ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ (прямо ΠΈΠ»ΠΈ косвСнно) ΠΎΡ‚ QObject.

Π‘Π»ΠΎΡ‚Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ программистом. Π’ΠΎΡ‚ возмоТная рСализация слота Counter::setValue():

Π‘Ρ‚Ρ€ΠΎΠΊΠ°, содСрТащая emit, заставляСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΡΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ сигнал valueChanged() с Π½ΠΎΠ²Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΌ Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΊΠΎΠ΄Π° ΠΌΡ‹ создаСм Π΄Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Counter ΠΈ соСдиняСм сигнал ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° valueChanged() со слотом Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° setValue(), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ QObject::connect():

Π’Ρ‹Π·ΠΎΠ² a.setValue(12) заставляСт a ΠΈΡΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ сигнал valueChanged(12), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ b Ρ‡Π΅Ρ€Π΅Π· слот setValue(), Ρ‚.Π΅. Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½Π° функция b.setValue(12). Π—Π°Ρ‚Π΅ΠΌ b сам испустит сигнал valueChanged(), Π½ΠΎ Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ связан с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ b Ρ‡Π΅Ρ€Π΅Π· сигнал valueChanged(), ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ сдСланного соСдинСния испускаСтся сигнал; Π΄Π²Π° сигнала ΠΈΡΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ для Π΄ΡƒΠ±Π»Π΅ΠΉ соСдинСний. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°Π·ΠΎΡ€Π²Π°Ρ‚ΡŒ всС эти соСдинСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ СдинствСнного Π²Ρ‹Π·ΠΎΠ²Π° disconnect(). Если Π²Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΡ‚Π΅ Qt::UniqueConnection type, соСдинСниС Π±ΡƒΠ΄Π΅Ρ‚ установлСно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ΠΎΠ½ΠΎ Π½Π΅ являСтся Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ. Если ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π΄ΡƒΠ±Π»ΡŒ (Ρ‚ΠΎΡ‚ ΠΆΠ΅ сигнал ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ слоту Ρ‚Π΅Ρ… ΠΆΠ΅ самых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²), соСдинСниС Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎ ΠΈ connect Π²Π΅Ρ€Π½Π΅Ρ‚ false.

Π‘Π±ΠΎΡ€ΠΊΠ° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°

ΠŸΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ C++ замСняСт ΠΈΠ»ΠΈ удаляСт ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова signals, slots ΠΈ emit для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ компилятору Π±Ρ‹Π» прСдоставлСн ΠΊΠΎΠ΄, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ стандарту C++.

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ moc ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ опрСдСлСния классов, содСрТащих сигналы ΠΈ слоты, ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ„Π°ΠΉΠ»Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ C++, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ скомпилированы ΠΈ связаны с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ прилоТСния. Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ qmake, Ρ‚ΠΎ Π² make-Ρ„Π°ΠΉΠ» Π±ΡƒΠ΄Π΅Ρ‚ автоматичСски Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π²Ρ‹Π·ΠΎΠ² moc.

Π‘ΠΈΠ³Π½Π°Π»Ρ‹

Π‘ΠΈΠ³Π½Π°Π»Ρ‹ ΠΈΡΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° измСняСтся Π΅Π³ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ состояниС, ΠΈ Ссли это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ интСрСсно Π΅Π³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ ΠΈΠ»ΠΈ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Ρƒ. Волько классы, содСрТащиС опрСдСлСния сигналов, ΠΈ ΠΈΡ… подклассы ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ сигналы.

ΠŸΡ€ΠΈ испускании сигнала слоты, с Π½ΠΈΠΌ связанныС, ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Когда это случаСтся, ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сигналов ΠΈ слотов ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ нСзависим ΠΎΡ‚ Ρ†ΠΈΠΊΠ»Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ событий графичСского интСрфСйса ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π·Π° Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ emit продолТится, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ всСх слотов. Π’ случаС с соСдинСниями Ρ‡Π΅Ρ€Π΅Π· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ситуация нСсколько ΠΎΡ‚Π»ΠΈΡ‡Π½Π°; ΠΏΡ€ΠΈ этом исполнСниС ΠΊΠΎΠ΄Π°, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π·Π° emit, продолТится Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, Π° слоты Π±ΡƒΠ΄ΡƒΡ‚ исполнСны нСсколько ΠΏΠΎΠ·ΠΆΠ΅.

Если нСсколько слотов связаны с ΠΎΠ΄Π½ΠΈΠΌ сигналом, Ρ‚ΠΎ ΠΏΡ€ΠΈ испускании сигнала ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ ΠΎΠ΄ΠΈΠ½ Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π² Ρ‚ΠΎΠΌ порядкС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ соСдинСны.

Π‘ΠΈΠ³Π½Π°Π»Ρ‹ автоматичСски Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ moc, ΠΈ Π²Ρ‹ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π² .cpp Ρ„Π°ΠΉΠ»Ρ‹. Они Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² (Ρ‚.Π΅. ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ void).

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹: наш ΠΎΠΏΡ‹Ρ‚ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ сигналы ΠΈ слоты Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Ρ‹ для ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ примСнСния, Ссли ΠΎΠ½ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ². Если сигнал QScrollBar::valueChanged() Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ, Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ гипотСтичСский QScrollBar::Range, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ соСдинСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ со слотами, спроСктированными ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для QScrollBar. Π‘ΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Ρ€Π°Π·Π½Ρ‹Ρ… Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² вмСстС Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

Π‘Π»ΠΎΡ‚Ρ‹

Π’Π°ΠΊ ΠΊΠ°ΠΊ слоты ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ функциями-Ρ‡Π»Π΅Π½Π°ΠΌΠΈ, ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΡ€Π°Π²Π° доступа, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ функциям-Ρ‡Π»Π΅Π½Π°ΠΌ. ВмСстС с Ρ‚Π΅ΠΌ, Π² качСствС слотов ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Ρ‹ Π»ΡŽΠ±Ρ‹ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ нСзависимо ΠΎΡ‚ уровня доступа посрСдством соСдинСния сигнал-слот. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ сигнал, испускаСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ класса, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ связан с Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ (private) слотом ΠΈ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½ Π² ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ постороннСм классС.

Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ слоты, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅.

По ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΌΠΈ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ, сигналы ΠΈ слоты Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ Π² связи с большСй Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚, Π½ΠΎ для Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ это Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ нСсущСствСнно. Π’ΠΎΠΎΠ±Ρ‰Π΅, испусканиС сигнала, связанного с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ слотами, ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π² Π΄Π΅ΡΡΡ‚ΡŒ Ρ€Π°Π· ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, Ρ‡Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ² Π½Π΅Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ° нСпосрСдствСнно. Π’Π°ΠΊ происходит, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ трСбуСтся бСзопасно ΠΏΠ΅Ρ€Π΅Π±Ρ€Π°Ρ‚ΡŒ всС соСдинСния (Ρ‚.Π΅. ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠΈ Π½Π΅ Π±Ρ‹Π»ΠΈ Ρ€Π°Π·Ρ€ΡƒΡˆΠ΅Π½Ρ‹ Π²ΠΎ врСмя испускания сигнала) ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π₯отя «Π΄Π΅ΡΡΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π½Π΅Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ» каТСтся Π΄ΠΎΠ»Π³ΠΈΠΌ, это мСньшС Ρ‡Π΅ΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, опСрация new ΠΈΠ»ΠΈ delete. Если Π²Ρ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚Π΅ строку, Π²Π΅ΠΊΡ‚ΠΎΡ€ ΠΈΠ»ΠΈ список, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Π²Ρ‹Π·ΠΎΠ²Π° new ΠΈΠ»ΠΈ delete, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сигналов ΠΈ слотов становятся Π½Π΅ самыми Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ потрСбитСлями Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Π’ΠΎ ΠΆΠ΅ самоС происходит, ΠΊΠΎΠ³Π΄Π° систСма Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ слот ΠΈΠ»ΠΈ косвСнно Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π±ΠΎΠ»Π΅Π΅ дСсятка Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. На i586-500 Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΊΠΎΠ»ΠΎ 2,000,000 сигналов, связанных с ΠΎΠ΄Π½ΠΈΠΌ слотом, Π² сСкунду, ΠΈΠ»ΠΈ ΠΎΠΊΠΎΠ»ΠΎ 1,200,000 сигналов, связанных с двумя слотами, Π² сСкунду. ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΈ Π³ΠΈΠ±ΠΊΠΈΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сигналов ΠΈ слотов являСтся Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΎΠΉ для Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π΄Π°ΠΆΠ΅ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚ΡŒ.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ с ΠΈΠΌΠ΅Π½Π΅ΠΌ signals ΠΈΠ»ΠΈ slots, ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ прСдупрСТдСния ΠΈ ошибки ΠΏΡ€ΠΈ компиляции с ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, созданным Π½Π° основС Qt. Π Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° прСпроцСссора #undef.

ΠœΠ΅Ρ‚Π°-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Π°Ρ информация

ΠœΠ΅Ρ‚Π°-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ компилятор (moc) просматриваСт Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΡŽ класса Π² Ρ„Π°ΠΉΠ»Π΅ C++ ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ‚Π°-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. ΠœΠ΅Ρ‚Π°-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ содСрТит ΠΈΠΌΠ΅Π½Π° всСх сигналов ΠΈ слотов ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ΠœΠ΅Ρ‚Π°-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ содСрТит Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Ρ‚Π°ΠΊΡƒΡŽ ΠΊΠ°ΠΊ имя класса ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π’Π°ΠΊΠΆΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, являСтся Π»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ наслСдником ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ класса, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΌΠ΅Ρ‚Π°-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² qobject_cast (), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ QObject::inherits(), Π½ΠΎ ΠΌΠ΅Π½Π΅Π΅ ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½ ошибкам:

Для получСния Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ смотритС БистСма ΠΌΠ΅Ρ‚Π°-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

Π Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°.

LcdNumber наслСдуСт QObject, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ сигналы ΠΈ слоты Ρ‡Π΅Ρ€Π΅Π· QFrame ΠΈ QWidget. Он Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° встроСнный Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ QLCDNumber.

ΠŸΡ€ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΈ прСпроцСссором, макрос Q_OBJECT Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ moc; Ссли Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… компилятора, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ «undefined reference to vtable for LcdNumber«, Π²Ρ‹, вСроятно, Π·Π°Π±Ρ‹Π»ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ moc ΠΈΠ»ΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ moc Π² ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ link.

moc явно Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ этого, Π½ΠΎ Ссли Π²Ρ‹ наслСдуСтС QWidget, ΠΏΠΎΡ‡Ρ‚ΠΈ навСрняка Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ parent Π² вашСм конструкторС ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² конструктор Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса.

НСкоторыС дСструкторы ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹ здСсь ΠΎΠΏΡƒΡ‰Π΅Π½Ρ‹; moc ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΡ….

LcdNumber испускаСт сигнал, ΠΊΠΎΠ³Π΄Π° Π΅Π³ΠΎ просят ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π΅Π²Π΅Ρ€Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Если Π²Ρ‹ Π½Π΅ Π·Π°Π±ΠΎΡ‚ΠΈΡ‚Π΅ΡΡŒ ΠΎ Ρ‚ΠΎΠΌ, Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π·Π° установлСнныС ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹, ΠΈΠ»ΠΈ считаСтС, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π° Π½ΠΈΡ… Π²Ρ‹ΠΉΡ‚ΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сигнал overflow(), Ρ‚.Π΅. Π½Π΅ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ с Π½ΠΈΠΌ Π½ΠΈ ΠΊΠ°ΠΊΠΎΠΉ слот.

Если Π²Ρ‹, Π½Π°ΠΏΡ€ΠΎΡ‚ΠΈΠ², Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ значСния Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°, соСдинитС сигнал с двумя слотами. Qt Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΈΡ… ΠΎΠ±Π° (Π² Ρ‚ΠΎΠΌ порядкС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ соСдинСны).

Π‘Π»ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ состояния Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ². LcdNumber ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ эту Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, ΠΊΠΎΠ΄, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’Π°ΠΊ ΠΊΠ°ΠΊ display() являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ интСрфСйса ΠΌΠ΅ΠΆΠ΄Ρƒ классом ΠΈ ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‚ΠΎ ΠΎΠ½ являСтся ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ (public) слотом.

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ сигнал valueChanged() ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° QScrollBar соСдиняСтся со слотом display(), Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ LCD-Π½ΠΎΠΌΠ΅Ρ€ Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ полосы ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ display() ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π°; Qt Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Π²ΠΎ врСмя соСдинСния сигнала со слотом. ΠŸΡ€ΠΈ использовании ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Ρ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Π»ΠΈ Π±Ρ‹ завСсти ΠΏΡΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π½Π°Π·Π²Π°Π½ΠΈΠΉ ΠΈ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ.

НСкоторыС нСсущСствСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π±Ρ‹Π»ΠΈ ΠΎΠΏΡƒΡ‰Π΅Π½Ρ‹.

Π‘ΠΈΠ³Π½Π°Π»Ρ‹ ΠΈ слоты с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

Π‘ΠΈΠ³Π½Π°Ρ‚ΡƒΡ€Ρ‹ сигналов ΠΈ слотов ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Рассмотрим QObject::destroyed():

ΠŸΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ QObject, ΠΎΠ½ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ сигнал QObject::destroyed(). ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ этот сигнал, Π³Π΄Π΅ Π±Ρ‹ Ρƒ нас Π½Π΅ Π±Ρ‹Π»Π° повисшая ссылка, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ QObject, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΡ‹ смоТСм привСсти Π΅Ρ‘ Π² порядок. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ сигнатура слота ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ:

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ сигнал со слотом ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ QObject::connect() ΠΈ макросы SIGNAL() ΠΈ SLOT(). ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ ΠΎ Ρ‚ΠΎΠΌ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π»ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈΠ»ΠΈ Π½Π΅Ρ‚ Π² макросы SIGNAL() ΠΈ SLOT(), Ссли Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‚ΠΎ сигнатура, пСрСданная Π² макрос SIGNAL(), Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² мСньшС, Ρ‡Π΅ΠΌ сигнатура, пСрСданная Π² макрос SLOT().

ВсС это Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ:

А это Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚:

. ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ слот Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ QObject, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сигнал Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ. Π­Ρ‚ΠΎ соСдинСниС Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ сообщСниС ΠΎΠ± ошибкС Π²ΠΎ врСмя выполнСния.

Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ΅ использованиС сигналов ΠΈ слотов

Для случаСв, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ информация ΠΎΠ± ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚Π΅Π»Π΅ сигнала, Qt прСдоставляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ QObject::sender(), Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΡƒΡŽ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ» сигнал.

Класс QSignalMapper прСдоставляСтся для ситуаций, ΠΊΠΎΠ³Π΄Π° ΠΌΠ½ΠΎΠ³ΠΎ сигналов соСдинСно с ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ слотом ΠΈ слоту Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ сигнал ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ.

Допустим, Π²Ρ‹ ΠΈΠΌΠ΅Π΅Ρ‚Π΅ Ρ‚Ρ€ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΊΠ°ΠΊΠΎΠΉ Ρ„Π°ΠΉΠ» Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚: «Tax File», «Accounts File» ΠΈΠ»ΠΈ «Report File».

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ QSignalMapper::setMapping() Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ всС сигналы clicked() Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ QSignalMapper. Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ присоСдиняСтС сигнал Ρ„Π°ΠΉΠ»Π° QPushButton::clicked() ΠΊ слоту QSignalMapper::map().

Π”Π°Π»Π΅Π΅, соСдиняСм сигнал mapped() со слотом readFile(), Π³Π΄Π΅ Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ какая ΠΊΠ½ΠΎΠΏΠΊΠ° Π½Π°ΠΆΠ°Ρ‚Π° Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒΡΡ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹.

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ компилируСтся ΠΈ запускаСтся, Π½ΠΎ ΠΈΠ·-Π·Π° Π½ΠΎΡ€ΠΌΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ сигнатуры ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅.

ИспользованиС Qt со сторонними сигналами ΠΈ слотами

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ использованиС Qt со сторонним ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ сигналов/слотов. Π’Ρ‹ Π΄Π°ΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅. Волько Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² свой Ρ„Π°ΠΉΠ» ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° qmake (.pro) ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ строку.

Π­Ρ‚ΠΎ сообщит Qt Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова moc signals, slots ΠΈ emit, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ эти ΠΈΠΌΠ΅Π½Π° Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ стороннСй Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Boost. Π—Π°Ρ‚Π΅ΠΌ, для продолТСния использования сигналов ΠΈ слотов Qt вмСстС с Ρ„Π»Π°Π³ΠΎΠΌ no_keywords, просто Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ всС использования ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов moc Qt Π² Π²Π°ΡˆΠΈΡ… исходных ΠΊΠΎΠ΄Π°Ρ… Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ макросы Qt Q_SIGNALS (ΠΈΠ»ΠΈ Q_SIGNAL), Q_SLOTS (ΠΈΠ»ΠΈ Q_SLOT) ΠΈ Q_EMIT.

ВсС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΎΡ€Π³ΠΎΠ²Ρ‹Π΅ ΠΌΠ°Ρ€ΠΊΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΡ… Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅Π². ΠŸΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ

Π›ΠΈΡ†Π΅Π½Π·ΠΈΠ°Ρ‚Ρ‹, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ коммСрчСскиС Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ Qt, ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Π² соотвСтствии с соглашСниями коммСрчСской Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ Qt, поставляСмой с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌ обСспСчСниСм, Π»ΠΈΠ±ΠΎ, Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎ, Π² соотвСтствии с условиями, содСрТащимися Π² письмСнном соглашСнии ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Π°ΠΌΠΈ ΠΈ Nokia.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, этот Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован Π² соотвСтствии с условиями GNU Free Documentation License version 1.3, ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½ΠΎΠΉ Ρ„ΠΎΠ½Π΄ΠΎΠΌ Free Software Foundation.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

ΠŸΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ графичСского интСрфСйса ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΌΡ‹ часто Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΈΠΌ элСмСнтам ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… элСмСнтов управлСния. Π‘ΠΎΠ»Π΅Π΅ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ связь ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Π»ΡŽΠ±Ρ‹Ρ… Π²ΠΈΠ΄ΠΎΠ². НапримСр, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ½ΠΎΠΏΠΊΡƒ Close ΠΌΡ‹, вСроятно, Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»Π° Π²Ρ‹Π·Π²Π°Π½Π° функция ΠΎΠΊΠ½Π° close().

Π‘ΠΈΠ³Π½Π°Π»Ρ‹ ΠΈ слоты

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ сигналы ΠΈ слоты Π² qt. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ сигналы ΠΈ слоты Π² qt. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ сигналы ΠΈ слоты Π² qt. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ сигналы ΠΈ слоты Π² qt. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ сигналы ΠΈ слоты Π² qt

Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ типобСзопасСн: сигнатура сигнала Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ сигнатурС ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π΅Π³ΠΎ слота. (ЀактичСски, слот ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΡƒΡŽ сигнатуру, Ρ‡Π΅ΠΌ сигнал, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ лишниС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹.) Π‘ΠΈΠ³Π½Π°Π»Ρ‹ ΠΈ слоты связаны Π½Π΅ Тёстко: Класс, ΠΈΡΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠΉ сигналы, Π½Π΅ Π·Π½Π°Π΅Ρ‚ ΠΈ Π½Π΅ интСрСсуСтся, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ· слотов ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ сигнал. ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сигналов ΠΈ слотов Qt Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ, Ссли Π’Ρ‹ соСдинили сигнал со слотом, слот Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ сигнала Π² Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚. Π‘ΠΈΠ³Π½Π°Π»Ρ‹ ΠΈ слоты ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ любоС количСство Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π»ΡŽΠ±Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ². Они ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ типобСзопасны.

ВсС классы, наслСдуСмыС ΠΎΡ‚ QObject ΠΈΠ»ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π΅Π³ΠΎ подклассов (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, QWidget) ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ сигналы ΠΈ слоты. Π‘ΠΈΠ³Π½Π°Π»Ρ‹ ΠΈΡΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ своСго состояния, Ссли это ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ интСрСсно Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ. ВсС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π΄Π΅Π»Π°ΡŽΡ‚ это для связи с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ. Π˜Ρ… Π½Π΅ Π·Π°Π±ΠΎΡ‚ΠΈΡ‚, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π»ΠΈ ΠΊΡ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ испускаСмыС ΠΈΠΌΠΈ сигналы. Π­Ρ‚ΠΎ являСтся истинной инкапсуляциСй ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΈ ΠΎΠ½Π° Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния.

Π‘Π»ΠΎΡ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ сигнал, Π½ΠΎ ΠΎΠ½ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±Ρ‹ΠΊΠ½ΠΎΠ²Π΅Π½Π½Ρ‹ΠΌΠΈ функциями-Ρ‡Π»Π΅Π½Π°ΠΌΠΈ. Π’Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ Π·Π½Π°Π΅Ρ‚, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π»ΠΈ ΠΊΡ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ сигналы, испускаСмыС ΠΈΠΌ, слоты Π½Π΅ Π·Π½Π°ΡŽΡ‚, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π»ΠΈ сигналы, с Π½ΠΈΠΌΠΈ связанныС. Π­Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ нСзависимыС Qt ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ слоту ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ сигналов, сколько Π²Π°ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Π½ΡƒΠΆΠ½ΠΎ, ΠΈ ΠΎΠ΄ΠΈΠ½ сигнал ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ соСдинСн со ΡΡ‚ΠΎΠ»ΡŒΠΊΠΈΠΌΠΈ слотами, сколько Π²Π°ΠΌ трСбуСтся. Π”Π°ΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ сигнал нСпосрСдствСнно с Π΄Ρ€ΡƒΠ³ΠΈΠΌ сигналом. (Π’Ρ‚ΠΎΡ€ΠΎΠΉ сигнал Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° испускаСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ.)

ВмСстС сигналы ΠΈ слоты ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΠΌΠΎΡ‰Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π½ΠΎΠ³ΠΎ программирования.

НСбольшой ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Минимальная дСкларация класса C++ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

НСбольшой класс, основанный Π½Π° QObject, ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

ВСрсия класса, основанная Π½Π° QObject, ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎ ΠΆΠ΅ самоС Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ состояниС ΠΈ прСдоставляСт ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для доступа ΠΊ Π½Π΅ΠΌΡƒ, Π½ΠΎ Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ этому ΠΎΠ½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ с использованиСм сигналов ΠΈ слотов. Π­Ρ‚ΠΎΡ‚ класс, испустив сигнал valueChanged(), ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ Π²ΠΎΠ²Π½Π΅, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ состояниС измСнилось, ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ слот, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡΡ‹Π»Π°Ρ‚ΡŒ сигналы.

ВсС классы, содСрТащиС сигналы ΠΈ слоты, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ макрос Q_OBJECT Π² Π½Π°Ρ‡Π°Π»Π΅ своСй Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΈ. Π’Π°ΠΊΠΆΠ΅ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ (прямо ΠΈΠ»ΠΈ косвСнно) ΠΎΡ‚ QObject.

Π‘Π»ΠΎΡ‚Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ программистом. Π’ΠΎΡ‚ возмоТная рСализация слота Counter::setValue():

Π‘Ρ‚Ρ€ΠΎΠΊΠ°, содСрТащая emit, заставляСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΡΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ сигнал valueChanged() с Π½ΠΎΠ²Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΌ Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΊΠΎΠ΄Π° ΠΌΡ‹ создаСм Π΄Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Counter ΠΈ соСдиняСм сигнал ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° valueChanged() со слотом Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° setValue(), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ QObject::connect():

Π’Ρ‹Π·ΠΎΠ² a.setValue(12) заставляСт a ΠΈΡΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ сигнал valueChanged(12), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ b Ρ‡Π΅Ρ€Π΅Π· слот setValue(), Ρ‚.Π΅. Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½Π° функция b.setValue(12). Π—Π°Ρ‚Π΅ΠΌ b сам испустит сигнал valueChanged(), Π½ΠΎ Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ связан с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ b Ρ‡Π΅Ρ€Π΅Π· сигнал valueChanged(), ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ сдСланного соСдинСния испускаСтся сигнал; Π΄Π²Π° сигнала ΠΈΡΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ для Π΄ΡƒΠ±Π»Π΅ΠΉ соСдинСний. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°Π·ΠΎΡ€Π²Π°Ρ‚ΡŒ всС эти соСдинСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ СдинствСнного Π²Ρ‹Π·ΠΎΠ²Π° disconnect(). Если Π²Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΡ‚Π΅ Qt::UniqueConnection type, соСдинСниС Π±ΡƒΠ΄Π΅Ρ‚ установлСно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ΠΎΠ½ΠΎ Π½Π΅ являСтся Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ. Если ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π΄ΡƒΠ±Π»ΡŒ (Ρ‚ΠΎΡ‚ ΠΆΠ΅ сигнал ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ слоту Ρ‚Π΅Ρ… ΠΆΠ΅ самых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²), соСдинСниС Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎ ΠΈ connect Π²Π΅Ρ€Π½Π΅Ρ‚ false.

Π‘Π±ΠΎΡ€ΠΊΠ° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°

ΠŸΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ C++ замСняСт ΠΈΠ»ΠΈ удаляСт ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова signals, slots ΠΈ emit для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ компилятору Π±Ρ‹Π» прСдоставлСн ΠΊΠΎΠ΄, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ стандарту C++.

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ moc ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ опрСдСлСния классов, содСрТащих сигналы ΠΈ слоты, ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ„Π°ΠΉΠ»Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ C++, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ скомпилированы ΠΈ связаны с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ прилоТСния. Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ qmake, Ρ‚ΠΎ Π² make-Ρ„Π°ΠΉΠ» Π±ΡƒΠ΄Π΅Ρ‚ автоматичСски Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π²Ρ‹Π·ΠΎΠ² moc.

Π‘ΠΈΠ³Π½Π°Π»Ρ‹

Π‘ΠΈΠ³Π½Π°Π»Ρ‹ ΠΈΡΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° измСняСтся Π΅Π³ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ состояниС, ΠΈ Ссли это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ интСрСсно Π΅Π³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ ΠΈΠ»ΠΈ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Ρƒ. Волько классы, содСрТащиС опрСдСлСния сигналов, ΠΈ ΠΈΡ… подклассы ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ сигналы.

ΠŸΡ€ΠΈ испускании сигнала слоты, с Π½ΠΈΠΌ связанныС, ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Когда это случаСтся, ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сигналов ΠΈ слотов ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ нСзависим ΠΎΡ‚ Ρ†ΠΈΠΊΠ»Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ событий графичСского интСрфСйса ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π·Π° Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ emit продолТится, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ всСх слотов. Π’ случаС с соСдинСниями Ρ‡Π΅Ρ€Π΅Π· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ситуация нСсколько ΠΎΡ‚Π»ΠΈΡ‡Π½Π°; ΠΏΡ€ΠΈ этом исполнСниС ΠΊΠΎΠ΄Π°, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π·Π° emit, продолТится Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, Π° слоты Π±ΡƒΠ΄ΡƒΡ‚ исполнСны нСсколько ΠΏΠΎΠ·ΠΆΠ΅.

Если нСсколько слотов связаны с ΠΎΠ΄Π½ΠΈΠΌ сигналом, Ρ‚ΠΎ ΠΏΡ€ΠΈ испускании сигнала ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ ΠΎΠ΄ΠΈΠ½ Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π² Ρ‚ΠΎΠΌ порядкС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ соСдинСны.

Π‘ΠΈΠ³Π½Π°Π»Ρ‹ автоматичСски Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ moc, ΠΈ Π²Ρ‹ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π² .cpp Ρ„Π°ΠΉΠ»Ρ‹. Они Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² (Ρ‚.Π΅. ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ void).

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹: наш ΠΎΠΏΡ‹Ρ‚ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ сигналы ΠΈ слоты Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Ρ‹ для ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ примСнСния, Ссли ΠΎΠ½ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ². Если сигнал QScrollBar::valueChanged() Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ, Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ гипотСтичСский QScrollBar::Range, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ соСдинСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ со слотами, спроСктированными ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для QScrollBar. Π‘ΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Ρ€Π°Π·Π½Ρ‹Ρ… Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² вмСстС Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

Π‘Π»ΠΎΡ‚Ρ‹

Π’Π°ΠΊ ΠΊΠ°ΠΊ слоты ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ функциями-Ρ‡Π»Π΅Π½Π°ΠΌΠΈ, ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΡ€Π°Π²Π° доступа, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ функциям-Ρ‡Π»Π΅Π½Π°ΠΌ. ВмСстС с Ρ‚Π΅ΠΌ, Π² качСствС слотов ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Ρ‹ Π»ΡŽΠ±Ρ‹ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ нСзависимо ΠΎΡ‚ уровня доступа посрСдством соСдинСния сигнал-слот. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ сигнал, испускаСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ класса, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ связан с Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ (private) слотом ΠΈ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½ Π² ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ постороннСм классС.

Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ слоты, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅.

По ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΌΠΈ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ, сигналы ΠΈ слоты Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ Π² связи с большСй Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚, Π½ΠΎ для Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ это Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ нСсущСствСнно. Π’ΠΎΠΎΠ±Ρ‰Π΅, испусканиС сигнала, связанного с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ слотами, ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π² Π΄Π΅ΡΡΡ‚ΡŒ Ρ€Π°Π· ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, Ρ‡Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ² Π½Π΅Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ° нСпосрСдствСнно. Π’Π°ΠΊ происходит, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ трСбуСтся бСзопасно ΠΏΠ΅Ρ€Π΅Π±Ρ€Π°Ρ‚ΡŒ всС соСдинСния (Ρ‚.Π΅. ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠΈ Π½Π΅ Π±Ρ‹Π»ΠΈ Ρ€Π°Π·Ρ€ΡƒΡˆΠ΅Π½Ρ‹ Π²ΠΎ врСмя испускания сигнала) ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π₯отя «Π΄Π΅ΡΡΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π½Π΅Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ» каТСтся Π΄ΠΎΠ»Π³ΠΈΠΌ, это мСньшС Ρ‡Π΅ΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, опСрация new ΠΈΠ»ΠΈ delete. Если Π²Ρ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚Π΅ строку, Π²Π΅ΠΊΡ‚ΠΎΡ€ ΠΈΠ»ΠΈ список, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Π²Ρ‹Π·ΠΎΠ²Π° new ΠΈΠ»ΠΈ delete, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сигналов ΠΈ слотов становятся Π½Π΅ самыми Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ потрСбитСлями Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Π’ΠΎ ΠΆΠ΅ самоС происходит, ΠΊΠΎΠ³Π΄Π° систСма Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ слот ΠΈΠ»ΠΈ косвСнно Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π±ΠΎΠ»Π΅Π΅ дСсятка Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. На i586-500 Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΊΠΎΠ»ΠΎ 2,000,000 сигналов, связанных с ΠΎΠ΄Π½ΠΈΠΌ слотом, Π² сСкунду, ΠΈΠ»ΠΈ ΠΎΠΊΠΎΠ»ΠΎ 1,200,000 сигналов, связанных с двумя слотами, Π² сСкунду. ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΈ Π³ΠΈΠ±ΠΊΠΈΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сигналов ΠΈ слотов являСтся Ρ…ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΎΠΉ для Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π΄Π°ΠΆΠ΅ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚ΡŒ.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ с ΠΈΠΌΠ΅Π½Π΅ΠΌ signals ΠΈΠ»ΠΈ slots, ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ прСдупрСТдСния ΠΈ ошибки ΠΏΡ€ΠΈ компиляции с ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, созданным Π½Π° основС Qt. Π Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° прСпроцСссора #undef.

ΠœΠ΅Ρ‚Π°-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Π°Ρ информация

ΠœΠ΅Ρ‚Π°-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ компилятор (moc) просматриваСт Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΡŽ класса Π² Ρ„Π°ΠΉΠ»Π΅ C++ ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ‚Π°-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. ΠœΠ΅Ρ‚Π°-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ содСрТит ΠΈΠΌΠ΅Π½Π° всСх сигналов ΠΈ слотов ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ΠœΠ΅Ρ‚Π°-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ содСрТит Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Ρ‚Π°ΠΊΡƒΡŽ ΠΊΠ°ΠΊ имя класса ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π’Π°ΠΊΠΆΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, являСтся Π»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ наслСдником ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ класса, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΌΠ΅Ρ‚Π°-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² qobject_cast (), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ QObject::inherits(), Π½ΠΎ ΠΌΠ΅Π½Π΅Π΅ ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½ ошибкам:

Для получСния Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ смотритС БистСма ΠΌΠ΅Ρ‚Π°-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

Π Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°.

LcdNumber наслСдуСт QObject, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ сигналы ΠΈ слоты Ρ‡Π΅Ρ€Π΅Π· QFrame ΠΈ QWidget. Он Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° встроСнный Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ QLCDNumber.

ΠŸΡ€ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΈ прСпроцСссором, макрос Q_OBJECT Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ moc; Ссли Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… компилятора, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ «undefined reference to vtable for LcdNumber«, Π²Ρ‹, вСроятно, Π·Π°Π±Ρ‹Π»ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ moc ΠΈΠ»ΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ moc Π² ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ link.

moc явно Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ этого, Π½ΠΎ Ссли Π²Ρ‹ наслСдуСтС QWidget, ΠΏΠΎΡ‡Ρ‚ΠΈ навСрняка Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ parent Π² вашСм конструкторС ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² конструктор Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса.

НСкоторыС дСструкторы ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹ здСсь ΠΎΠΏΡƒΡ‰Π΅Π½Ρ‹; moc ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΡ….

LcdNumber испускаСт сигнал, ΠΊΠΎΠ³Π΄Π° Π΅Π³ΠΎ просят ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π΅Π²Π΅Ρ€Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Если Π²Ρ‹ Π½Π΅ Π·Π°Π±ΠΎΡ‚ΠΈΡ‚Π΅ΡΡŒ ΠΎ Ρ‚ΠΎΠΌ, Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π·Π° установлСнныС ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹, ΠΈΠ»ΠΈ считаСтС, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π° Π½ΠΈΡ… Π²Ρ‹ΠΉΡ‚ΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сигнал overflow(), Ρ‚.Π΅. Π½Π΅ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ с Π½ΠΈΠΌ Π½ΠΈ ΠΊΠ°ΠΊΠΎΠΉ слот.

Если Π²Ρ‹, Π½Π°ΠΏΡ€ΠΎΡ‚ΠΈΠ², Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ значСния Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°, соСдинитС сигнал с двумя слотами. Qt Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΈΡ… ΠΎΠ±Π° (Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΌ порядкС).

Π‘Π»ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ состояния Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ². LcdNumber ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ эту Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, ΠΊΠΎΠ΄, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’Π°ΠΊ ΠΊΠ°ΠΊ display() являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ интСрфСйса ΠΌΠ΅ΠΆΠ΄Ρƒ классом ΠΈ ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‚ΠΎ ΠΎΠ½ являСтся ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ (public) слотом.

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ сигнал valueChanged() ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° QScrollBar соСдиняСтся со слотом display(), Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ LCD-Π½ΠΎΠΌΠ΅Ρ€ Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ полосы ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ display() ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π°; Qt Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Π²ΠΎ врСмя соСдинСния сигнала со слотом. ΠŸΡ€ΠΈ использовании ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Ρ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Π»ΠΈ Π±Ρ‹ завСсти ΠΏΡΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π½Π°Π·Π²Π°Π½ΠΈΠΉ ΠΈ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ.

НСкоторыС нСсущСствСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π±Ρ‹Π»ΠΈ ΠΎΠΏΡƒΡ‰Π΅Π½Ρ‹.

Π‘ΠΈΠ³Π½Π°Π»Ρ‹ ΠΈ слоты с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

Π‘ΠΈΠ³Π½Π°Ρ‚ΡƒΡ€Ρ‹ сигналов ΠΈ слотов ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Рассмотрим QObject::destroyed():

ΠŸΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ QObject, ΠΎΠ½ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ сигнал QObject::destroyed(). ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ этот сигнал, Π³Π΄Π΅ Π±Ρ‹ Ρƒ нас Π½Π΅ Π±Ρ‹Π»Π° повисшая ссылка, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ QObject, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΡ‹ смоТСм привСсти Π΅Ρ‘ Π² порядок. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ сигнатура слота ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ:

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ сигнал со слотом ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ QObject::connect() ΠΈ макросы SIGNAL() ΠΈ SLOT(). ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ ΠΎ Ρ‚ΠΎΠΌ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π»ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈΠ»ΠΈ Π½Π΅Ρ‚ Π² макросы SIGNAL() ΠΈ SLOT(), Ссли Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‚ΠΎ сигнатура, пСрСданная Π² макрос SIGNAL(), Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² мСньшС, Ρ‡Π΅ΠΌ сигнатура, пСрСданная Π² макрос SLOT().

ВсС это Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ:

А это Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚:

. ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ слот Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ QObject, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сигнал Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ. Π­Ρ‚ΠΎ соСдинСниС Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ сообщСниС ΠΎΠ± ошибкС Π²ΠΎ врСмя выполнСния.

Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ΅ использованиС сигналов ΠΈ слотов

Для случаСв, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ информация ΠΎΠ± ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚Π΅Π»Π΅ сигнала, Qt прСдоставляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ QObject::sender(), Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΡƒΡŽ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ» сигнал.

Класс QSignalMapper прСдоставляСтся для ситуаций, ΠΊΠΎΠ³Π΄Π° ΠΌΠ½ΠΎΠ³ΠΎ сигналов соСдинСно с ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ слотом ΠΈ слоту Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ сигнал ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ.

Допустим, Π²Ρ‹ ΠΈΠΌΠ΅Π΅Ρ‚Π΅ Ρ‚Ρ€ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΊΠ°ΠΊΠΎΠΉ Ρ„Π°ΠΉΠ» Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚: «Tax File», «Accounts File» ΠΈΠ»ΠΈ «Report File».

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ QSignalMapper::setMapping() Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ всС сигналы clicked() Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ QSignalMapper. Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ присоСдиняСтС сигнал Ρ„Π°ΠΉΠ»Π° QPushButton::clicked() ΠΊ слоту QSignalMapper::map().

Π”Π°Π»Π΅Π΅, соСдиняСм сигнал mapped() со слотом readFile(), Π³Π΄Π΅ Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ какая ΠΊΠ½ΠΎΠΏΠΊΠ° Π½Π°ΠΆΠ°Ρ‚Π° Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒΡΡ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹.

ИспользованиС Qt со сторонними сигналами ΠΈ слотами

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ использованиС Qt со сторонним ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ сигналов/слотов. Π’Ρ‹ Π΄Π°ΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅. Волько Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² свой Ρ„Π°ΠΉΠ» ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° qmake (.pro) ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ строку.

Π­Ρ‚ΠΎ сообщит Qt Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова moc signals, slots ΠΈ emit, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ эти ΠΈΠΌΠ΅Π½Π° Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ стороннСй Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Boost. Π—Π°Ρ‚Π΅ΠΌ, для продолТСния использования сигналов ΠΈ слотов Qt вмСстС с Ρ„Π»Π°Π³ΠΎΠΌ no_keywords, просто Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ всС использования ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов moc Qt Π² Π²Π°ΡˆΠΈΡ… исходных ΠΊΠΎΠ΄Π°Ρ… Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ макросы Qt Q_SIGNALS (ΠΈΠ»ΠΈ Q_SIGNAL), Q_SLOTS (ΠΈΠ»ΠΈ Q_SLOT) ΠΈ Q_EMIT.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *