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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QT 4: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ GUI Π½Π° Π‘++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 31

Автор Жасмин Π‘Π»Π°Π½ΡˆΠ΅Ρ‚

13 QString IconEditorPlugin::group() const

14 {

15 return tr("Image Manipulation Widgets");

16 }

Ѐункция group() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ имя Π³Ρ€ΡƒΠΏΠΏΡ‹ Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ², ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚. Если это имя Π΅Ρ‰Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Qt Designer coздаст Π½ΠΎΠ²ΡƒΡŽ Π³Ρ€ΡƒΠΏΠΏΡƒ для Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°.

17 QIcon IconEditorPlugin::icon() const

18 {

19 return QIcon(":/images/iconeditor.png");

20 }

Ѐункция icon() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠΈΠΊΡ‚ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для прСдставлСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² Qt Designer. Π’ нашСм случаС ΠΌΡ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ IconEditorPlugin ΠΈΠΌΠ΅Π΅Ρ‚ рСсурсный Ρ„Π°ΠΉΠ» Qt, содСрТащий ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт для изобраТСния Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° ΠΏΠΈΠΊΡ‚ΠΎΠ³Ρ€Π°ΠΌΠΌ.

21 QString IconEditorPlugin::toolTip() const

22 {

23 return tr("An icon editor widget");

24 }

Ѐункция toolTip() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π²ΡΠΏΠ»Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ подсказку, которая появляСтся, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ΡˆΠΊΠ° находится Π½Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π΅ Π² ΠΏΠ°Π½Π΅Π»ΠΈ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² Qt Designer.

25 QString IconEditorPlugin::whatsThis() const

26 {

27 return tr("This widget is presented in Chapter 5 of <i>C++ GUI "

28 "Programming with Qt 4</i> as an example of a custom Qt "

29 "widget.");

30 }

Ѐункция whatsThis() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ тСкст Β«What's This?Β» (Ρ‡Ρ‚ΠΎ это?) для отобраТСния Π² Qt Designer.

31 bool IconEditorPlugin::isContainer() const

32 {

33 return false;

34 }

Ѐункция isContainer() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, Ссли Π΄Π°Π½Π½Ρ‹ΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ false. НапримСр, QFrame прСдставляСт собой Π²ΠΈΠ΄ΠΆΠ΅Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹. Π’ Ρ†Π΅Π»ΠΎΠΌ любой Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹, Π½ΠΎ Qt Designer Π½Π΅ позволяСт это Π΄Π΅Π»Π°Ρ‚ΡŒ, Ссли isContainer() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ false.

35 QWidget *IconEditorPlugin::createWidget(QWidget *parent)

36 {

37 return new IconEditor(parent);

38 }

Ѐункция createWidget() вызываСтся Qt Designer для создания экзСмпляра класса Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° для ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°.

39 Q_EXPORT_PLUGIN2(iconeditorplugin, IconEditorPlugin)

Π’ ΠΊΠΎΠ½Ρ†Π΅ исходного Ρ„Π°ΠΉΠ»Π° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ класса ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠ³ΠΎ модуля ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ макрос Q_EXPORT_PLUGIN2(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Π³ΠΎ доступным для Qt Designer. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ β€” Π½Π°Π·Π½Π°Ρ‡Π°Π΅ΠΌΠΎΠ΅ Π½Π°ΠΌΠΈ имя ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠ³ΠΎ модуля, Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ β€” имя класса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для построСния ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠ³ΠΎ модуля Ρ„Π°ΠΉΠ» .pΠ³ΠΎ выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

TEMPLATE = lib

CONFIG += designer plugin release

HEADERS = ../iconeditor/iconeditor.h \

iconeditorplugin.h

SOURCES = ../iconeditor/iconeditor.cpp \

iconeditorplugin.cpp

RESOURCES = iconeditorplugin.qrc

DESTDIR = $(QTDIR)/plugins/designer

Π€Π°ΠΉΠ» .pro ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ пСрСмСнная окруТСния QTDIR установлСна Π½Π° ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π³Π΄Π΅ располагаСтся Qt. Когда Π²Ρ‹ Π²Π²ΠΎΠ΄ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ make ΠΈΠ»ΠΈ nmake для построСния ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠ³ΠΎ модуля, ΠΎΠ½ автоматичСски устанавливаСтся Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ plugins Qt Designer. ПолС построСния ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠ³ΠΎ модуля Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ IconEditor ΠΌoΠΆeΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Qt Designer Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΊΠ°ΠΊ, Π»ΡŽΠ±Ρ‹Π΅ встроСнныС Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ Qt.

Если трСбуСтся ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Qt Designer нСсколько ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ², Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π»ΠΈΠ±ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ…, Π»ΠΈΠ±ΠΎ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ всС Π² ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, рСализуя интСрфСйс QDesignerCustomWidgetCollectionInterface.

Двойная буфСризация

Двойная буфСризация являСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ программирования графичСского ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° формируСтся Π²Π½Π΅ экрана Π² Π²ΠΈΠ΄Π΅ пиксСльной ΠΊΠ°Ρ€Ρ‚Ρ‹, ΠΈ Π·Π°Ρ‚Π΅ΠΌ эта пиксСльная ΠΊΠ°Ρ€Ρ‚Π° выводится Π½Π° экран. Π’ Ρ€Π°Π½Π½ΠΈΡ… вСрсиях Qt этот ΠΌΠ΅Ρ‚ΠΎΠ΄ часто использовался для прСдотвращСния мСрцания изобраТСния ΠΈ для построСния Π±ΠΎΠ»Π΅Π΅ быстрого ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса.

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

ΠœΡ‹ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠΌ Π΄Π°Π½Π½ΡƒΡŽ Π³Π»Π°Π²Ρƒ рассмотрСниСм ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Plotter (ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒ Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ²). Π­Ρ‚ΠΎΡ‚ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΄Π²ΠΎΠΉΠ½ΡƒΡŽ Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ дСмонстрируСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ аспСкты Qt—программирования, Π² Ρ‚ΠΎΠΌ числС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ событий ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΡƒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² ΠΈ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π½Ρ‹Π΅ систСмы.

Π’ΠΈΠ΄ΠΆΠ΅Ρ‚ Plotter Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π½Π° экран ΠΎΠ΄Π½Ρƒ ΠΈΠ»ΠΈ нСсколько ΠΊΡ€ΠΈΠ²Ρ‹Ρ…, Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ Π΅Π΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ‡Π΅Ρ€Ρ‚ΠΈΡ‚ΡŒ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Ρ€Π΅Π·ΠΈΠ½ΠΎΠ²ΡƒΡŽ Π»Π΅Π½Ρ‚Ρƒ, ΠΈ Plotter ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ ΠΊΡ€ΡƒΠΏΠ½Ρ‹ΠΌ ΠΏΠ»Π°Π½ΠΎΠΌ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΡƒΡŽ Π² Π½Π΅ΠΉ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ‹Ρ‡Π΅Ρ€Ρ‡ΠΈΠ²Π°Π΅Ρ‚ Ρ€Π΅Π·ΠΈΠ½ΠΎΠ²ΡƒΡŽ Π»Π΅Π½Ρ‚Ρƒ, дСлая сначала Ρ‰Π΅Π»Ρ‡ΠΎΠΊ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅ изобраТСния, пСрСтаскивая Π·Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ΡˆΠΊΡƒ с Π½Π°ΠΆΠ°Ρ‚ΠΎΠΉ Π»Π΅Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΈ освобоТдая ΠΊΠ»Π°Π²ΠΈΡˆΡƒ ΠΌΡ‹ΡˆΠΊΠΈ.

Рис. 5.7. Π£Π²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ изобраТСния Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Plotter.

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, нСсколько Ρ€Π°Π· ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ€Π΅Π·ΠΈΠ½ΠΎΠ²ΡƒΡŽ Π»Π΅Π½Ρ‚Ρƒ, ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ Zoom Out (ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅) ΠΈ Π·Π°Ρ‚Π΅ΠΌ вновь Π΅Π³ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ½ΠΎΠΏΠΊΠΈ Zoom In (ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅). Кнопки Zoom In ΠΈ Zoom Out ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±Π° изобраТСния, ΠΈ поэтому ΠΎΠ½ΠΈ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°ΡΠ»ΠΎΠ½ΡΡ‚ΡŒ экран, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ измСняСт ΠΌΠ°ΡΡˆΡ‚Π°Π± прСдставлСния Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹.

Π’ΠΈΠ΄ΠΆΠ΅Ρ‚ Plotter ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ любого количСства ΠΊΡ€ΠΈΠ²Ρ‹Ρ…. Он Ρ‚Π°ΠΊΠΆΠ΅ содСрТит стСк ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π³Ρ€Π°Ρ„ΠΈΠΊΠ° PlotSettings, ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ соотвСтствуСт ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ ΠΌΠ°ΡΡˆΡ‚Π°Π±Ρƒ изобраТСния.

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим этот класс, начиная с Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° plotter.h:

01 #ifndef PLOTTER_H

02 #define PLOTTER_H

03 #include <QMap>

04 #include <QPixmap>

05 #include <QVector>

06 #include <QWidget>

07 class QToolButton;

08 class PlotSettings;


09 class Plotter : public QWidget

10 {

11 Q_OBJECT

12 public:

13 Plotter(QWidget *parent = 0);

14 void setPlotSettings(const PlotSettings &settings);

15 void setCurveData(int id, const QVector<QPointF> &data);

16 void clearCurve(int id);

17 QSize minimumSizeHint() const;

18 QSize sizeHint() const;

19 public slots:

20 void zoomIn();

21 void zoomOut();

Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ для Qt—классов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ построитСля Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ², ΠΈ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ объявляСм классы, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΈΠ»ΠΈ ссылки Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅.

Π’ классС Plotter ΠΌΡ‹ прСдоставляСм Ρ‚Ρ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для настройки Π³Ρ€Π°Ρ„ΠΈΠΊΠ° ΠΈ Π΄Π²Π° ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… слота для увСличСния ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ ΠΌΠ°ΡΡˆΡ‚Π°Π±Π° изобраТСния. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ пСрСопрСдСляСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ minimumSizeHint() ΠΈ sizeHint() класса QWidget. ΠœΡ‹ Ρ…Ρ€Π°Π½ΠΈΠΌ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΊΡ€ΠΈΠ²ΠΎΠΉ Π² Π²Π΅ΠΊΡ‚ΠΎΡ€Π΅ QVector<QPointF>, Π³Π΄Π΅ QPointF β€” вСрсия QPoint для Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ.

22 protected:

23 void paintEvent(QPaintEvent *event);

24 void resizeEvent(QResizeEvent *event);

25 void mousePressEvent(QMouseEvent *event);

26 void mouseMoveEvent(QMouseEvent *event);

27 void mouseReleaseEvent(QMouseEvent *event);

28 void keyPressEvent(QKeyEvent *event);

29 void wheelEvent(QWheelEvent *event);

Π’ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠΉ сСкции класса ΠΌΡ‹ объявляСм всС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ событий QWidget, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ.

30 private:

31 void updateRubberBandRegion();

32 void refreshPixmap();

33 void drawGrid(QPainter *painter);

34 void drawCurves(QPainter *painter);

35 enum { Margin = 50 };

36 QToolButton *zoomInButton;

37 QToolButton *zoomOutButton;


38 QMap<int, QVector<QPointF> > curveMap;

39 QVector<PlotSettings> zoomStack;

40 int curZoom;

41 bool rubberBandIsShown;

42 QRect rubberBandRect;

43 QPixmap pixmap;

44 };

Π’ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ сСкции класса ΠΌΡ‹ объявляСм нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для рисования Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°, константу ΠΈ нСсколько ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…β€”Ρ‡Π»Π΅Π½ΠΎΠ². ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π° Margin примСняСтся для обСспСчСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ свободного пространства Π²ΠΎΠΊΡ€ΡƒΠ³ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹.

Π‘Ρ€Π΅Π΄ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…β€”Ρ‡Π»Π΅Π½ΠΎΠ² находится pixmap, которая ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ QPixmap. Π­Ρ‚Π° пСрСмСнная содСрТит копию всСго Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΡƒΡŽ Π΅Π³ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ Π½Π° экранС. Π“Ρ€Π°Ρ„ΠΈΠΊ всСгда сначала строится Π²Π½Π΅ экрана Π½Π° пиксСльной ΠΊΠ°Ρ€Ρ‚Π΅, ΠΈ Π·Π°Ρ‚Π΅ΠΌ пиксСльная ΠΊΠ°Ρ€Ρ‚Π° помСщаСтся Π½Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚.