Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 186

Автор НСйл ΠœΡΡ‚ΡŒΡŽ

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΠΊΠ½ΠΎ Qt (рис. 17.2).

$ ./qtl

Рис. 17.2 


Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ GTK+ здСсь Π½Π΅Ρ‚ Π²ΠΌΠ΅Ρ‰Π°ΡŽΡ‰Π΅Π³ΠΎ Π² сСбя всС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° qt.h, поэтому Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ явно Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ всСх ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π²Ρ‹ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Π΅Ρ‚Π΅ΡΡŒ, β€” QApplication. Π­Ρ‚ΠΎ Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Qt, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π² Π΅ΠΌΡƒ Π² самом Π½Π°Ρ‡Π°Π»Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ прилоТСния Qt Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° QApplication, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΅Ρ‰Π΅. QApplication ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π΅Π»ΠΎ с Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌΠΈ встроСнными опСрациями Qt, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° событий, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ строк ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ внСшним прСдставлСниСм.

Π’Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° QApplication: setMainWidget, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаСт Π³Π»Π°Π²Π½Ρ‹ΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ вашСго прилоТСния, ΠΈ exec, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запускаСт Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ†ΠΈΠΊΠ»Π° отслСТивания событий. ΠœΠ΅Ρ‚ΠΎΠ΄ exec Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π»ΠΈΠ±ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ QApplication::quit(), Π»ΠΈΠ±ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΡ€Ρ‹Ρ‚ Π³Π»Π°Π²Π½Ρ‹ΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚.

QMainWindow β€” Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ ΠΎΠΊΠ½Π° Π² Qt, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ мСню, панСль инструмСнтов ΠΈ строку состояния. Он Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ³Ρ€Π°Ρ‚ΡŒ Π²Π°ΠΆΠ½ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ Π² этой Π³Π»Π°Π²Π΅, ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ Π½Π°ΡƒΡ‡ΠΈΡ‚Π΅ΡΡŒ Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ Π΅Π³ΠΎ возмоТности ΠΈ Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π² Π½Π΅Π³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹, Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ интСрфСйс.

Π”Π°Π»Π΅Π΅ ΠΌΡ‹ обсудим ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ программирования, управляСмого событиями, ΠΈ Π²Ρ‹ вставитС Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ PushButton.

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

Как Π²Ρ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Π² Π³Π»Π°Π²Π΅ 16, сигналы ΠΈ ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° β€” Π³Π»Π°Π²Π½Ρ‹Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ прилоТСниями GUI для рСагирования Π½Π° Π²Π²ΠΎΠ΄ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΈ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ GUI. ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сигналов ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚Π° Qt состоит ΠΈΠ· сигналов ΠΈ слотов ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠΎΠ², Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… сигналами ΠΈ функциями ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° Π² ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚Π΅ инструмСнтов GTK+ ΠΈΠ»ΠΈ событиями ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ событий Π² языкС программирования Java.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π˜ΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ сигналы Qt ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ сигналов UNIX, ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π²ΡˆΠΈΡ…ΡΡ Π² Π³Π»Π°Π²Π΅ 11.

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ устроСно ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, управляСмоС событиями: графичСский интСрфСйс ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ состоит ΠΈΠ· мСню, ΠΏΠ°Π½Π΅Π»Π΅ΠΉ инструмСнтов, ΠΊΠ½ΠΎΠΏΠΎΠΊ, ΠΏΠΎΠ»Π΅ΠΉ Π²Π²ΠΎΠ΄Π° ΠΈ мноТСства Π΄Ρ€ΡƒΠ³ΠΈΡ… элСмСнтов GUI, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌΠΈ. Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ взаимодСйствуСт с Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡƒΠ½ΠΊΡ‚ мСню ΠΈΠ»ΠΈ Π²Π²ΠΎΠ΄ΠΈΡ‚ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ тСкст Π² ΠΏΠΎΠ»Π΅ Π²Π²ΠΎΠ΄Π°, Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ сигнал, Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ clicked, text_changed ΠΈΠ»ΠΈ key_pressed. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π²Π°ΠΌ захочСтся ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π² ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° дСйствиС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ ΠΈΠ»ΠΈ Π²Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ· прилоТСния, ΠΈ Π²Ρ‹ выполняСтС это, связав сигнал с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° ΠΈΠ»ΠΈ слотом Π½Π° языкС Qt.

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

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ с использованиСм Qt β€” Π½Π΅ настоящий ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π° Π‘++. ΠŸΠΎΡ€ΠΎΠΉ это становится ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ². Π‘ΠΌ. Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ Qt Π½Π° Web-сайтС http://doc.trolltech.com/, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ примСнСния этих Π½ΠΎΠ²Ρ‹Ρ… ΠΏΡΠ΅Π²Π΄ΠΎΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов Π² Π‘++. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ сигналов ΠΈ слотов Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠΆ отличаСтся ΠΎΡ‚ Microsoft Foundation Classes (MFC, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов Microsoft) Π² ОБ Windows, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ языка Π‘++.

На способы примСнСния сигналов ΠΈ слотов Π² Qt Π΅ΡΡ‚ΡŒ нСсколько ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ, Π½ΠΎ ΠΎΠ½ΠΈ Π½Π΅ слишком сущСствСнныС:

β–‘ ΡΠΈΠ³Π½Π°Π»Ρ‹ ΠΈ слоты Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ функциями-ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ класса-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° QObject;

β–‘ ΠΏΡ€ΠΈ использовании мноТСствСнного наслСдования QObject Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π² спискС класса;

β–‘ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Q_OBJECT Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΡΠ²Π»ΡΡ‚ΡŒΡΡ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π² объявлСнии класса;

β–‘ ΡΠΈΠ³Π½Π°Π»Ρ‹ нСльзя ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π² ΡˆΠ°Π±Π»ΠΎΠ½Π°Ρ…;

β–‘ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π² сигналах ΠΈ слотах;

β–‘ ΡΠΈΠ³Π½Π°Π»Ρ‹ ΠΈ слоты Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒΡΡ ΠΈΠ»ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒΡΡ Π΄ΠΎ статуса public (общСдоступный).

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΈΡΠ°Ρ‚ΡŒ ваши сигналы ΠΈ слоты ΠΊΠ°ΠΊ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° QObject, Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ваш интСрфСйс, Ρ€Π°ΡΡˆΠΈΡ€ΡΡ ΠΈ настраивая Π²ΠΈΠ΄ΠΆΠ΅Ρ‚, начиная с QWidget, Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Qt, ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° QObject. Π’ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚Π΅ Qt Π²Ρ‹ ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ интСрфСйсы, Ρ€Π°ΡΡˆΠΈΡ€ΡΡ Ρ‚Π°ΠΊΠΈΠ΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹, ΠΊΠ°ΠΊ QMainWindow.

Π’ΠΈΠΏΠΈΡ‡Π½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ класса Π² Ρ„Π°ΠΉΠ»Π΅ MyWindow.h для вашСго GUI Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ Π΄Π°Π»Π΅Π΅:

class MyWindow : public QMainWindow {

 Q_OBJECT

public:

 MyWindow();

 virtual ~MyWindow();

signals:

 void aSignal();

private slots:

 void doSomething();

}

Π’Π°Ρˆ класс β€” наслСдник ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° QMainWindow, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ возмоТности Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΡ€ΠΈ создании Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Π²Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ подкласс QDialog. ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ ΡƒΠΊΠ°Π·Π°Π½ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Q_OBJECT, Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠ°ΠΊ ΠΌΠ΅Ρ‚ΠΊΠ° для прСпроцСссора, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ объявлСния конструктора ΠΈ дСструктора. Π”Π°Π»Π΅Π΅ Π΄Π°Π½Ρ‹ опрСдСлСния сигнала ΠΈ слота.

Π£ вас Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ сигнал ΠΈ ΠΎΠ΄ΠΈΠ½ слот, ΠΎΠ±Π° Π±Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Для пороТдСния сигнала aSignal() Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ всСго лишь Π² любом мСстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ emit:

emit aSignal();

Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ обрабатываСтся Qt. Π’Π°ΠΌ Π΄Π°ΠΆΠ΅ Π½Π΅ потрСбуСтся рСализация aSignal().

Для примСнСния слотов ΠΈΡ… Π½ΡƒΠΆΠ½ΠΎ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ с сигналом. ДСлаСтся это ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π°Π·Π²Π°Π½Π½ΠΎΠ³ΠΎ статичСского ΠΌΠ΅Ρ‚ΠΎΠ΄Π° connect класса QObject:

bool QObject::connect(const QObject * sender, const char* signal,

 const QObject * receiver, const char * member);

ΠŸΡ€ΠΎΡΡ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π²Π»Π°Π΄Π΅ΡŽΡ‰ΠΈΠΉ сигналом (ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚Π΅Π»ΡŒ), Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ сигнала, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π²Π»Π°Π΄Π΅ΡŽΡ‰ΠΈΠΉ слотом (ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠΎΠΌ), ΠΈ Π² Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ имя слота.

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ MyWindow, Ссли Π±Ρ‹ Π²Ρ‹ Π·Π°Ρ…ΠΎΡ‚Π΅Π»ΠΈ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ сигнал clicked Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° QPushButton с вашим слотом doSomething, Π²Ρ‹ Π±Ρ‹ написали:

connect(button, SIGNAL(clicked()), this, SLOT(doSomething()));

Π£Ρ‡Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ макросы SIGNAL ΠΈ SLOT для выдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ сигналов ΠΈ слотов. Как ΠΈ Π² ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚Π΅ GTK+, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ ряд слотов с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ сигналом ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ слот с Π»ΡŽΠ±Ρ‹ΠΌ количСством сигналов с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ мноТСствСнных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ connect. Если ΠΎΠ½Π° Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎ, Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ FALSE.

ΠžΡΡ‚Π°Π΅Ρ‚ΡΡ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ваш слот Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-ΠΌΠ΅Ρ‚ΠΎΠ΄Π°:

void MyWindow::doSomething() {

 // Код слота

}

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 17.2.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 17.2. Π‘ΠΈΠ³Π½Π°Π»Ρ‹ ΠΈ слоты

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, зная основы использования сигналов ΠΈ слотов, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ ΠΈΡ… Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅. Π£ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΡƒΠΉΡ‚Π΅ QMainWindow, Π²ΡΡ‚Π°Π²ΡŒΡ‚Π΅ Π² Π½Π΅Π³ΠΎ ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΈ свяТитС сигнал ΠΊΠ½ΠΎΠΏΠΊΠΈ clicked со слотом.

1. Π’Π²Π΅Π΄ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ объявлСниС класса ΠΈ Π½Π°Π·ΠΎΠ²ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ» ButtonWindow.h:

#include <qmainwindow.h>


class ButtonWindow : public QMainWindow {

 Q_OBJECT

public:

 ButtonWindow(QWidget *parent = 0, const char *name = 0);

 virtual ~ButtonWindow();

private slots:

 void Clicked();

};

2. Π”Π°Π»Π΅Π΅ слСдуСт рСализация класса Π² Ρ„Π°ΠΉΠ»Π΅ ButtonWindow.cpp:

#include "ButtonWindow.moc"

#include <qpushbutton.h>

#include <qapplication.h>

#include <iostream>

3. Π’ конструкторС Π²Ρ‹ Π·Π°Π΄Π°Π΅Ρ‚Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΎΠΊΠ½Π°, создаСтС ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΈ связываСтС сигнал наТатия ΠΊΠ½ΠΎΠΏΠΊΠΈ с вашим слотом. setCaption β€” ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ‚ΠΈΠΏΠ° QMainWindow, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, Ρ‡Ρ‚ΠΎ Π½Π΅ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π·Π°Π΄Π°Π΅Ρ‚ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΎΠΊΠ½Π°:

ButtonWindow::ButtonWindow(QWidget *parent, const char* name) : QMainWindow(parent, name) {

 this->setCaption("This is the window Title");

 QPushButton *button = new QPushButton("Click Me!", this, "Button1");

 button->setGeometry(50, 30, 70, 20);

 connect(button, SIGNAL(clicked()), this, SLOT(Clicked()));

}

4. Qt автоматичСски удаляСт Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹, поэтому ваш дСструктор пуст:

ButtonWindow::~ButtonWindow() {}

5. Π—Π°Ρ‚Π΅ΠΌ рСализация слота:

void ButtonWindow::Clicked(void) {

 std::cout << "clicked!\n";

}

6. Π˜ Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main Π²Ρ‹ просто создаСтС экзСмпляр Ρ‚ΠΈΠΏΠ° ButtonWindow, Π΄Π΅Π»Π°Π΅Ρ‚Π΅ Π΅Π³ΠΎ Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΎΠΊΠ½ΠΎΠΌ вашСго прилоТСния ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚Π΅ ΠΎΠΊΠ½ΠΎ Π½Π° экранС:

int main(int argc, char **argv) {

 QApplication app(argc, argv);

 ButtonWindow *window = new ButtonWindow();

 app.setMainWidget(window);

 window->show();

 return app.exec();

}

7. ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π²Ρ‹ смоТСтС ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ прСпроцСссор для Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° этого прСпроцСссора называСтся Meta Object Compiler (moc, компилятор ΠΌΠ΅Ρ‚Π°ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°) ΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° Π² ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚Π° Qt. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ moc для Ρ„Π°ΠΉΠ»Π° ButtonWindow.h, сохранив Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² Ρ„Π°ΠΉΠ»Π΅ ButtonWindow.moc: