QT Whitepaper
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®
ÇöÀçÀ§Ä¡ : QT_Whitepaper



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
  • QT ¹Ì´Ï»çÀÌÆ®·Î

ÀÌ ¹®¼­´Â [http]qt whitepaperÀÇ ¹ø¿ª ¹®¼­´Ù.


Contents

1 ¼Ò°³
2 Executive Summary
3 Widgets
3.1 ¾È³ç QT
3.2 ³»Àå À§Á¬µé
3.3 »ç¿ëÀÚ Á¤ÀÇ À§Á¬
4 ½Ã±×³Î°ú ½½·Ô
4.1 ½Ã±×³Î ½½·Ô ¿¹Á¦
4.2 Meta Object Compiler
5 GUI ¾ÖÇø®ÄÉÀÌ¼Ç Á¦ÀÛ
5.1 Main Window
5.2 ¸Þ´º
5.3 Åø¹Ù
5.4 dz¼± µµ¿ò¸»
5.5 Çൿ (Actions)
5.6 Áß¾Ó À§Á¬(Central Widget)
5.7 Multiple Document Interface
5.8 ´ëÈ­»óÀÚ(Dialogs)
5.9 Dock Windows
5.10 Settings
5.11 ¸ÖƼ ¾²·¹µå
6 QT °³¹ßµµ±¸µé
6.1 QT Designer
6.2 QT Assistant
7 GUI ¾ÖÇø®ÄÉÀÌ¼Ç ¿¹Á¦
8 2D¿Í 3D ±×·¡ÇÈ
8.1 2D ±×·¡ÇÈ
8.2 3D ±×·¡ÇÈ
9 Database


1 ¼Ò°³

QT´Â ¸ÖƼ Ç÷§Æû GUI¿Í ¾ÖÇø®ÄÉÀÌ¼Ç Á¦ÀÛÀ» À§ÇØ °³¹ßµÇ¾îÁø ŸŶ ¶óÀ̺귯¸®·Î [http]trolltech¿¡¼­ °³¹ßÁßÀÎ ¶óÀ̺귯¸®´Ù. QT´Â C++ Ŭ·¡½º ¶óÀ̺귯¸® ÇüÅ·ΠÁ¦À۵Ǿî ÀÖÀ¸¸ç, ºü¸£°í Á÷°üÀûÀÎ ¾ÖÇø®ÄÉÀÌ¼Ç Á¦ÀÛÀÌ °¡´ÉÇϵµ·Ï µµ¿ÍÁØ´Ù. ¶ÇÇÑ QT´Â ¸ÖƼ Ç÷§ÆûÀ» Áö¿øÇÏ´Â °Í ¿Ü¿¡µµ ±¹Á¦È­¸¦ Áö¿øÇϰí ÀÖÀ¸¸ç À̸¦ ÀÌ¿ëÇØ¼­ ³ÐÀº ½ÃÀå¿¡¼­ »ç¿ë°¡´ÉÇÑ ¾ÖÇø®ÄÉÀ̼ÇÀÇ Á¦ÀÛÀÌ °¡´ÉÇØ Áø´Ù.

QT C++ ŸŶÀº 1995³â ºÎÅÍ ¿©·¯°¡Áö »ó¿ë ¾ÖÇø®ÄÉÀ̼ÇÀÇ Á¦ÀÛÀ§ÇØ »ç¿ëµÇ¾îÁ³´Ù. AT&A, IBM, NASA, Xerox¿Í °°Àº Ä¿´Ù¶õ ±Ô¸ðÀÇ È¸»ç¿Í ¿¬±¸¼Ò¿¡¼­ ºÎÅÍ ´Ù¸¥ ¸¹Àº ÀÛÀº ȸ»ç¿Í ±â°üµé¿¡¼­µµ »ç¿ëµÇ¾îÁö°í ÀÖ´Ù. QT´Â 3.1¹öÁ¯ÀÌ À̸£·¯¼­ ´õ¿í´õ ½±¿öÁö°í °­·ÂÇØ Á³´Ù. QTÀÇ Å¬·¡½º´Â °³¹ßÀÚ·Î ÇÏ¿©±Ý ºü¸¥½Ã°£¿¡ ÇнÀ°¡´ÉÇÑ °ß°íÇÑ ÀÎÅÍÆäÀ̽º¸¦ Áö¿øÇÏ¸ç °³¹ß½Ã°£À» ´ÜÃà ½ÃÄÑÁØ´Ù. QT´Â ¿ÏÀüÈ÷ °´Ã¼ÁöÇâÀûÀ¸·Î °³¹ßµÇ¾î Áö°í ÀÖ´Ù.

ÀÌ whitepaperÀº QTÇÔ¼ö¿Í ±â¼ú¿¡ ´ëÇÑ °³·«ÀúÀÎ ¼Ò°³¸¦ À§Çؼ­ ÀÛ¼ºµÇ¾îÁ³´Ù. óÀ½ ¸î°³ÀÇ ÀåÀº ±â¼úÀûÀÌÁö ¾ÊÀº ¼Ò°³¿¡ °ü·ÃµÈ ³»¿ëÀ» ´ã°í ÀÖÀ¸¸ç, ÀåÀÌ ´õÇØÁú ¼ö·Ï ±íÀº ±â¼úÀûÀÎ ³»¿ëµé¿¡ ´ëÇØ¼­ ¼³¸íÇϰí ÀÖ´Ù.

2 Executive Summary

QT´Â Ç¥ÁØÀûÀÎ GUIȯ°æÀÇ Áö¿øÀ» À§ÇÑ ¿ÏÀüÇÑ À§Á¬(Widget)À» Æ÷Çϰí ÀÖ´Ù. QT´Â signal°ú slots¶ó´Â Çõ½ÅÀûÀÎ ³»ºÎ °´Ã¼°£ Åë½ÅÀ» À§ÇÑ µµ±¸¸¦ Áö¿øÇϰí ÀÖÀ¸¸ç, À̰ÍÀº ±âÁ¸ÀÇ ¿À·¡µÇ°í ºÒ¾ÈÀüÇÑ callback ±â¼úÀ» ´ëüÇϰí ÀÖ´Ù. QT´Â ¸¶¿ì½ºÅ¬¸¯°ú ŰÀԷµîÀ» Á¦¾îÇϱâ À§Çؼ­ conventional Event ¸ðµ¨À» Á¦°øÇϰí ÀÖ´Ù. QT´Â ¸ÖƼ Ç÷§Æû GUI ¾ÖÇø®ÄÉÀ̼ÇÀ» À§ÇÑ Ç¥ÁØÀûÀÎ À¯Àú ÀÎÅÍÆäÀ̽º Áï ¸Þ´º, µå·¡±× ¾Ø µå·Ó, Åø¹Ù, dz¼± µµ¿ò¸»µîÀ» °ÅÀÇ ¿Ïº®ÇÏ°Ô Áö¿øÇÑ´Ù.

QT´Â QT DesignerÀ̶ó´Â °­·ÂÇÑ À¯Àú ÀÎÅÍÆäÀ̽º µðÀÚÀÎ ÇÁ·Î±×·¥À» Á¦°øÇÑ´Ù. ÀÌ ÇÁ·Î±×·¥À» ÀÌ¿ëÇØ¼­ »ç¿ëÀÚ´Â ½Ã°¢ÀûÀ¸·Î À¯Àú ÀÎÅÍÆäÀ̽º¸¦ ºü¸£°Ô µðÀÚÀÎÇÒ ¼ö ÀÖ´Ù. À̿ܿ¡µµ °­·ÂÇÑ IDEÀÎ Kdevelop¸¦ ÀÌ¿ëÇØ¼­ ¾ÈÁ¤ÀûÀÎ ÅëÇÕ°³¹ßȯ°æÀ» ±¸ÃàÇÒ ¼öµµ ÀÖ´Ù.

QT´Â 2D¿Í 3D±×·¡ÇÈÀ» Áö¿øÇÑ´Ù. ¶ÇÇÑ OpenGLÀ» Áö¿øÇϴµ¥ À̸¦ ÀÌ¿ëÇØ¼­ Ç÷§Æû µ¶¸³ÀúÀÎ ±×·¡ÇÈ °³¹ßÈ­°æÀÇ ±¸ÃàÀÌ °¡´ÉÇÏ´Ù.

QT´Â ¿©·¯°¡Áö Ç¥ÁØ µ¥ÀÌÅͺ£À̽ºµéÀ» Áö¿øÇϸç, À̸¦ ÀÌ¿ëÇØ¼­ Ç÷§Æû µ¶¸³ÀûÀÎ µ¥ÀÌÅÍ º£À̽º¾ÖÇø®ÄÉÀ̼ÇÀ» Á¦ÀÛÇÒ ¼ö ÀÖ´Ù. QT´Â Oracle, Microsoft SQL Server, Sybase Adaptive Server, PostgreSQL, MySQL, ODBCµîÀÇ ´Ù¾çÇÑ µ¥ÀÌÅͺ£À̽º µå¶óÀ̹ö¸¦ Á¦°øÇÑ´Ù. ÀÌ·¯ÇÑ QTÀÇ µ¥ÀÌÅͺ£À̽º ÇÔ¼öµéÀº QT Designer¿¡ ¿Ïº®ÇÏ°Ô °áÇյǾ »ç¿ëÇÒ ¼ö ÀÖ´Ù. µ¥ÀÌÅͺ£À̽º ¾ÖÇø®ÄÉÀ̼ÇÀÇ °³¹ßÀ» À§Çؼ­ µ¥ÀÌÅͺ£À̽º °ü·Ã À§Á¬À» Áö¿øÇÑ´Ù

ÃÖ½ÅÀÇ ÅøÅ¶ÀÌ ±×·¯ÇϵíÀÌ QT¿ª½Ã style°¡ Å׸¶¸¦ Áö¿øÇϰí À̸¦ ÅëÇØ¼­ Ç÷§Æû¿¡ °ü°è¾øÀÌ µ¿ÀÏÇÑ ´À³¦ÀÇ ¾ÖÇø®ÄÉÀÌ¼Ç ½ÇÇàȯ°æÀ» ¸¸µé ¼ö ÀÖ´Ù. ÇϳªÀÇ ¼Ò½º Æ®¸®°¡ ¸¸µé¾î Áø´Ù¸é ´Ù½Ã ÄÚµùÇÒ ÇÊ¿ä ¾øÀÌ ÀçÄÄÆÄÀÏ ÇÏ´Â Á¤µµ·Î Windows, Mac OS X, Linux, Solaris, HP-UX¿Í °°Àº ¿î¿µÃ¼Á¦¿¡¼­ ÀÛµ¿ÇÏ´Â Äڵ带 »ý¼ºÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ ÀÓº£µðµå ȯ°æ ¿ª½Ã Áö¿øÇϰí ÀÖ´Ù. QT´Â qmak¸¦ Á¦°øÇϴµ¥ À̰ÍÀ» ÀÌ¿ëÇÏ¸é ¸ñÇ¥ Ç÷¿ÆûÀ» Áö¿øÇÏ´Â makefile°ú .dsp ÆÄÀÏÀ» ½±°Ô »ý¼ºÇÒ ¼ö ÀÖ´Ù.

QT´Â À¯´ÏÄڵ带 Áö¿øÇϴµ¥ ÀÌ´Â ±¹Á¦È­¸¦ Ãæ½ÇÈ÷ Áö¿øÇÏ´Â ¾ÖÇø®ÄÉÀ̼ÇÀÇ °³¹ßÀÌ °¡´ÉÇØÁüÀ» ÀǹÌÇÑ´Ù. ÀÌ·¯ÇÑ ±¹Á¦È­¸¦ À§Çؼ­ QT´Â Qt Linguist¿Í °°Àº ¹ø¿ªµµ±¸¸¦ Á¦°øÇÑ´Ù. QT·Î ÀÛ¼ºÇÑ ¾ÖÇø®ÄÉÀ̼ÇÀº Áß±¹, ¿µ¾î, ÀϺ»¾î, ·¯½Ã¾Æ¾î, Çѱ¹¾î¿Í °°Àº ¾ð¾î¸¦ ½±°Ô Àû¿ëÇÒ ¼ö ÀÖ´Ù.
QT´Â ´Ù¾çÇÑ domain-specific Ŭ·¡½º¸¦ Áö¿øÇÑ´Ù. SAX¿Í DOM ÆÄ¼­¸¦ Æ÷ÇÔÇÏ´Â XML ¸ðµâÀÌ ±×°ÍÀÌ´Ù. °´Ã¼µéÀº QT¿¡¼­ Á¦°øÇÏ´Â STLÆ÷ȯ Ŭ·¡½ºµéÀ» ÅëÇØ¼­ ½±°Ô ¸Þ¸ð¸®¿¡ ÀúÀåµÉ ¼ö ÀÖ´Ù. ·ÎÄÃ¿Í ¸®¸ðÆ®ÆÄÀÏ Á¦¾î ¿ª½Ã QTÀÇ Input/Output °ú ³×Æ®¿öÅ· Ŭ·¡½º¿¡ ÀÇÇØ¼­ ÀÌ·ç¾îÁø´Ù. ÀÌ´Â ÄÚµåÀÇ Àϰü¼ºÀ» À¯ÁöÇÒ ¼ö ÀÖµµ·Ï µµ¿ÍÁØ´Ù.

QT ¾ÖÇø®ÄÉÀ̼ÇÀº Ç÷¯±×Àΰú µ¿Àû ¶óÀ̺귯¸®¸¦ ÅëÇØ¼­ È®Àå°¡´ÉÇϵµ·Ï ÀÛ¼ºµÉ ¼ö ÀÖ´Ù. Ç÷¯±×ÀÎÀº ºÎ°¡ÀûÀÎ ÄÚµ¦, µ¥ÀÌÅͺ£À̽º µå¶óÀ̹ö, À̹ÌÁö Æ÷¸Ë, ½ºÅ¸ÀÏ, À§Á¬µîÀ» Á¦°øÇÑ´Ù.

QT´Â ½ÅÁßÇÏ°Ô °èȹµÇ¾î¼­ ¸¸µé¾îÁø C++ŸŶÀ¸·Î ¼¼°èÀÇ ¸¹Àº Áö¿ª¿¡¼­ »ç¿ëµÇ¾îÁö°í ÀÖ´Ù. QT´Â KDE¿Í °°Àº ¸®´ª½º µ¥½ºÅ©Å¾È¯°æÀÇ ÇÙ½ÉÀ¸·Î »ç¿ëµÇ°í ÀÖÀ¸¸ç, À̿ܿ¡µµ ¸¹Àº »ó¿ë ¾ÖÇø®ÄÉÀ̼ÇÀÇ Á¦ÀÛÀ» À§Çؼ­µµ »ç¿ëµÇ°í ÀÖ´Ù.

3 Widgets

QT´Â ¸ðµç À§Á¬ÀÇ ¿ÏÀüÇÑ ¼¼Æ®¸¦ Á¦°øÇÑ´Ù. À§Á¬Àº À¯Àú ÀÎÅÍÆäÀ̽º¸¦ ¸¸µé±â À§ÇÑ ½Ã°¢Àû ¿ä¼ÒµéÀÌ´Ù. ¹öư, ¸Þ´º, ½ºÅ©·Ñ ¹Ù, ¸Þ½ÃÁö ¹Ú½º, ¾ÖÇø®ÄÉÀÌ¼Ç À©µµ¿ìµîÀÌ ¸ðµÎ À§Á¬ÀÇ ¿ä¼Ò°¡ µÈ´Ù. ÀÌ·¯ÇÑ À§Á¬µéÀº ÄÁÆ®·Ñ(Controls)°ú ÄÁÅ×À̳Ê(containers)ÀÌ ºÐ¸®µÇÁö ¾ÊÀº »óÅ·Π¼³°èµÇ¾î ÀÖ´Ù. ¶ÇÇÑ ÀÌ¹Ì Á¸ÀçÇÏ´Â QTÀ§Á¬ÀÇ ¼­ºê Ŭ·¡½ºµé·Î ºÎÅÍ ½±°Ô À¯Àú Á¤ÀÇ À§Á¬À» »ý¼ºÇÒ ¼ö ÀÖ´Ù.

http://www.trolltech.com/products/qt/whitepaper/qwidget-diag.png

À§Á¬Àº QWidget°ú À̰ÍÀÇ ¼­ºêŬ·¡½ºÀÇ »ó¼Óµé·Î ÀÌ·ç¾îÁö¸ç »ç¿ëÀÚ Á¤ÀÇ À§Á¬Àº ¼­ºêŬ·¡½º¿¡ ÀÇÇØ¼­ »ý¼ºµÈ´Ù. ¾î¶² À§Á¬µéÀº ¸î°³ÀÇ ÀÚ½Ä À§Á¬À» °¡Áö°Ô µÈ´Ù. ÀÚ½Ä À§Á¬Àº ºÎ¸ð À§Á¬ÀÇ ºÎºÐÀ» º¸¿©ÁÖ´Â °ÍÀ» ´ã´çÇÑ´Ù. ºÎ¸ð°¡ ¾ø´Â À§Á¬Àº top-level À§Á¬À̶ó°í Çϸç, ±× ÀÚ½ÅÀÌ À©µµ¿ì°¡ µÉ ¼ö ÀÖ´Ù. QT´Â À§Á¬ÀÇ »ç¿ë¿¡ À־ Á¦ÇÑÀ» °¡ÇÏÁö ¾Ê´Â´Ù. À§Á¬Àº top-level À§Á¬ÀÌ µÉ ¼ö ÀÖÀ¸¸ç µ¿½Ã¿¡ ´Ù¸¥ À§Á¬ÀÇ ÀϺηΠÂü¿©ÇÏ´Â ÀÚ½Ä À§Á¬ÀÌ µÉ ¼öµµ ÀÖ´Ù. ºÎ¸ðÀ§Á¬¿¡ Á¸ÀçÇÏ´Â ÀÚ½Ä À§Á¬ÀÇ À§Ä¡´Â layout managers¿¡ ÀÇÇØ¼­ ÀÚµ¿ÀûÀ¸·Î °áÁ¤µÈ´Ù.

¶óº§, ¸Þ½ÃÁö ¹Ú½º, ÅøÆÁµîÀº »ö, ÆùÆ®, ¾ð¾îÀÇ »ç¿ëµî¿¡ À־ Á¦ÇÑÀÌ ¾ø´Ù. QTÀÇ ÅØ½ºÆ® ·»´õ¸µ À§Á¬Àº HTMLÀÇ ¼­ºê¼ÂÀ» ÀÌ¿ëÇÏ¹Ç·Î½á ¸ÖÆ¼¹ÙÀÌÆ® ¾ð¾î¿ª½Ã ¿Ïº®ÇÏ°Ô Ç¥ÇöÇÒ ¼ö ÀÖ´Ù. ¿©±â¿¡ ´ëÇØ¼­´Â Text Entry and Rendering¸¦ Âü°íÇϱ⠹ٶõ´Ù.

3.1 ¾È³ç QT

http://www.joinc.co.kr/albums/album01/agw.png

´ÙÀ½Àº "¾È³ç QT"¸¦ Ãâ·ÂÇÏ´Â ÇÁ·Î±×·¥ÀÇ ¿ÏÀüÇÑ ¼Ò½ºÄÚµå´Ù.
#include <qapplication.h> 
#include <qlabel.h> 
#include <qstring.h> 
 
int main(int argc, char **argv) 
{ 
    QApplication app (argc, argv); 
    QString Label = "<font color=blue><h1>¾È³ç QT</h1></font>"; 
    QLabel *hello = new QLabel(QString::fromLocal8Bit(Label), 0); 
    app.setMainWidget(hello); 
    hello->show(); 
    return app.exec(); 
} 
 
QT¿¡¼­ Á¦°øÇÏ´Â tmake¸¦ ÀÌ¿ëÇØ¼­ makefileÀ» »ý¼º½ÃŰ¸é °£´ÜÇÏ°Ô ÄÄÆÄÀÏ ÇÒ ¼ö ÀÖ´Ù. tmake¿¡ ´ëÇÑ ³»¿ëÀºTMake »ç¿ëÇϱ⸦ Âü°íÇϱ⠹ٶõ´Ù.

3.2 ³»Àå À§Á¬µé

´ÙÀ½ ½ºÅ©¸° ¼¦Àº QT¿¡¼­ Á¦°øÇÏ´Â ³»Àå À§Á¬µéÀÇ ½ºÅ©¸°¼¦ÀÌ´Ù. QT¿¡¼­ Áö¿øÇÏ´Â À§Á¬µéÀÇ ½ºÅ¸ÀÏÀ» º¼ ¼ö ÀÖ´Ù.


QHBox¿¡ ÇÔ²² ¾²ÀÎ QLabel°ú QPushButton

QButtonGroup¿Í QCheckBox¸¦ ÀÌ¿ëÇØ¼­ ·¹À̾ƿôÀ» Àâ°í °Å±â¿¡ QRadioButtonsÀ§Á¬À» »ç¿ëÇÑ ¸ð½À

QGroupBox·Î ·¹À̾ƿôÀ» Àâ°í ¿©±â¿¡ QDateTimeEdit, QLineEdit, QTextEdit, QComboBox¸¦ ¹èÄ¡ÇÑ ¸ð½À

QGrid·Î ·¹À̾ƿôÀ» Àâ°í QDial, QProgressBar, QSpinBox, QScrollBar, QLCDNumber, QSliderÀ» ¹èÄ¡ÇÑ ¸ð½À

QGrid·Î ·¹À̾ƿôÀ» Àâ°í QIconView, QListView, QListBox, QTable¸¦ ¹èÄ¡ÇÑ ¸ð½À

¸¹Àº µ¥ÀÌÅ͸¦ º¸¿©Áà¾ß ÇÏ´Â QTable, QListView, QTextEditÀÇ °æ¿ì ÀÚµ¿ÀûÀ¸·Î ½ºÅ©·ÑÀ» Áö¿øÇÑ´Ù.
QMainWindow, QMenuBar, QToolBarÀº GUI ¾ÖÇø®ÄÉÀ̼ÇÀÇ ±âº»ÀûÀΠƲÀ» ¸¸µé¾î ÁÖ±â À§Çؼ­ »ç¿ëÇÑ´Ù. QMessageBox, QFileDialog, QTabDialob, QWizardµîÀÇ À§Á¬Àº ¾ÖÇø®ÄÉÀÌ¼Ç »ó¿¡¼­ °¢Á¾ ´ëÈ­»óÀÚµéÀ» Áö¿øÇÑ´Ù. ¶ÇÇÑ 2D ¿Í 3D ±×·¡ÇÈÀÇ Áö¿øÀ» À§ÇÑ QCanvas¿Í QGLWidgetµµ Áö¿øÇÑ´Ù.

À§ÀÇ ½ºÅ©¸´¼¦¿¡¼­ º¼ ¼ö ÀÖ´Â QRadioButtons¿Í QCheckBox´Â ´ÙÀ½°ú °°Àº °£´ÜÇÑ ÄÚµå·Î ¸¸µé¾î ³¾ ¼ö ÀÖ´Ù.
parent = new QButtonGroup( 2, Qt::Vertical, "QButtonGroup" ); 
radio1 = new QRadioButton( "&Radio 1", parent ); 
radio2 = new QRadioButton( "R&adio 2", parent ); 
radio1->setChecked( true ); 
check1 = new QCheckBox( "&Check 1", parent ); 
check2 = new QCheckBox( "C&heck 2", parent ); 
check2->setChecked( true ); 
 

3.3 »ç¿ëÀÚ Á¤ÀÇ À§Á¬

QT°¡ GUI ȯ°æ¿¡¼­ ÇÊ¿äÇÑ ¸ðµç À§Á¬À» Á¦°øÇϱä ÇÏÁö¸¸ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Ù º¸¸é Ç¥ÁØ À§Á¬¸¸À¸·Î´Â ºÎÁ·ÇÒ ¶§°¡ ÀÖ´Ù. QT´Â QWiget°ú ÀÌ À§Á¬ÀÇ ¼­ºêŬ·¡½º µîÀ» ÀÌ¿ëÇØ¼­ °£´ÜÇÏ°Ô »ç¿ëÀÚ Á¤ÀÇ À§Á¬À» ¸¸µé µµ·Ï Áö¿øÇϰí ÀÖ´Ù. ´ÙÀ½Àº clockÀ§Á¬À» ¸¸µé±â À§ÇÑ ÄÚµå´Ù.

http://www.joinc.co.kr/albums/album01/agx.png

´ÙÀ½Àº clock.h ÆÄÀÏÀÌ´Ù.
#include <qlcdnumber.h> 
 
class Clock : public QLCDNumber 
{ 
public: 
    Clock( QWidget *parent = 0, const char *name = 0 ); 
 
protected: 
    void timerEvent( QTimerEvent *event ); 
 
private: 
    void showTime(); 
 
    bool showingColon; 
}; 
 
Clock´Â LCD¸¦ Áö¿øÇÏ´Â QLCDNumberÀ§Á¬À¸·Î ºÎÅÍ »ó¼ÓµÈ´Ù. timerEvent()ÇÔ¼ö´Â QOjbect·Î ºÎÅÍ »ó¼ÓµÈ´Ù.

´ÙÀ½Àº clock.cpp ÆÄÀÏÀÌ´Ù.
#include <qdatetime.h> 
 
#include "clock.h" 
 
Clock::Clock( QWidget *parent, const char *name ) 
    : QLCDNumber( parent, name ), showingColon( true ) 
{ 
    showTime(); 
    startTimer( 1000 ); 
} 
 
void Clock::timerEvent( QTimerEvent * ) 
{ 
    showTime(); 
} 
 
void Clock::showTime() 
{ 
    QString time = QTime::currentTime().toString().left( 5 ); 
    if ( !showingColon ) 
        time[2] = ' '; 
    display( time ); 
    showingColon = !showingColon; 
} 
 
»ý¼ºÀÚ´Â swhoTime()À» È£ÃâÇÑ´Ù. ÀÌ ÇÔ¼ö´Â ÇöÀç ½Ã°£À¸·Î clock¸¦ ÃʱâÈ­ ÇÏ°í ¸Å 1000 milliseconds¸¶´Ù timerEvent()¸¦ È£ÃâÇØ¼­ LCD¸¦ ¸®ÇÁ·¹½¬ ÇÑ´Ù.

showTime()À» º¸¸é QLCDNumber::display¸¦ÀÌ¿ëÇØ¼­ ÇöÀç½Ã°£À» °¡Á®¿Â´Ù. ½Ã°£ÀÌ È帣°í ÀÖ´Ù´Â °ÍÀ» ½Ã°¢ÀûÀ¸·Î º¸¿©ÁÖ±â À§Çؼ­ Äݷаú °ø¹éÀ» ¹ø°¥¾Æ °¡¸é¼­ Ãâ·ÂÇÑ´Ù.

À̰ÍÀ¸·Î ¿ÏÀüÇÑ À§Á¬ÀÌ Çϳª ¸¸µé¾î Á³´Ù. ¾Æ·¡ÀÇ ÄÚµå·Î Å×½ºÆ®ÇÒ ¼ö ÀÖ´Ù.
#include <qapplication.h> 
#include "clock.h" 
 
int main( int argc, char **argv ) 
{ 
    QApplication app( argc, argv ); 
    Clock *clock = new Clock; 
    app.setMainWidget( clock ); 
    clock->show(); 
    return app.exec(); 
} 
 
¾Æ ÇÁ·Î±×·¥Àº ÇϳªÀÇ (clock)À§Á¬¸¸À» Æ÷ÇÔÇϰí ÀÖÀ¸¸ç ´Ù¸¥ ¾î¶² ÀÚ½Ä À§Á¬µµ Æ÷ÇÔÇϰí ÀÖÁö ¾Ê´Ù.

»ç¿ëÀÚ Á¤ÀÇ À§Á¬À» ¸¸µé¶§ scratchÀ§Á¬À» ÀÌ¿ëÇØ¼­ ¸¸µé ¼öµµ ÀÖ´Ù. ¿¹¸¦ µé¾î ¾Æ³¯·Î±× ½Ã°è¸¦ ¸¸µé·Á°í ÇÑ´Ù¸é ÃÊħ, ºÐħµîÀ» ±×·Á³¾ ¼ö ÀÖÀ¸¾ß ÇÒ°ÍÀÌ´Ù. ¿©±â¿¡ ´ëÇÑ ³»¿ëÀº 2D graphics¸¦ Âü°íÇϱ⠹ٶõ´Ù.

4 ½Ã±×³Î°ú ½½·Ô

GUI ¾ÖÇø®ÄÉÀ̼ÇÀº À¯ÀúÀÇ Çൿ¿¡ ¹ÝÀÀÇØ¾ß ÇÑ´Ù. ¸Þ´º ¾ÆÀÌÅÛÀ¸ Ŭ¸¯, Åø¹Ù ¹öÅÏŬ¸¯µîÀÇ ÇൿÀ» ÇßÀ» ¶§ Àû´çÇÑ Äڵ带 ½ÇÇà ½ÃÄѾßÇÑ´Ù. trollÀº °¢ °´Ã¼°£ Åë½ÅÇÒ ¼ö ÀÖ´Â Á»´õ Áøº¸ÀûÀÎ ¹æ¹ýÀ» »ç¿ëÇÏ±æ ¿øÇß´Ù. ÀÌ·¯±â À§Çؼ­ ÇÁ·Î±×·¡¸Ó´Â À̺¥Æ®¿Í À̺¥Æ®¸¦ ¹Þ¾Æ¼­ ó¸®ÇÒ Äڵ带 ¼­·Î ¿¬°á½ÃÄÑÁÙ ¼ö ÀÖ¾î¾ß¸¸ ÇÑ´Ù. ¿À·¡µÈ ŸŶµéÀÌ »ç¿ëÇÏ´Â ¸ÅÄ¿´ÏÁòÀº ¾ÈÀüÇÏÁö ¾Ê¾Ò°í, È®ÀåÀÌ ¿ëÀÌ ÇÏÁö ¾Ê¾ÒÀ¸¸ç, °´Ã¼ÁöÇâÀûÀÌÁö ¾Ê¾Ò´Ù. Trolltech´Â À̹®Á¦ÀÇ ÇØ°áÀ» À§Çؼ­ ½Ã±×³Î°ú ½½·Ô(Signals and Slot)¶ó´Â ¸ÅÄ¿´ÏÁüÀ» µµÀÔÇß´Ù. ½Ã±×³Î ½½·ÔÀº Äݹé°ú ¸Å½ÃÁö ¸Ê(message maps)À» ¿ÏÀüÈ÷ ´ëüÇÏ¸ç °­·ÂÇÑ ³»ºÎ °´Ã¼°£ Åë½Å ¹æ¹ýÀ» Á¦°øÇÑ´Ù. ¶ÇÇÑ È®ÀåÀÌ ¿ëÀÌÇÏ¸ç ¿ÏÀüÈ÷ °´Ã¼ÁöÇâÀÌ´Ù.

¿À·¡µÈ ÄÝ¹é ¸ÅÄ¿´ÏÁòÀº ¹öưÀ» Ŭ¸¯ÇßÀ» ¶§ ½ÇÇà½Ãų ÇÔ¼öÀÇ Æ÷ÀÎÅ͸¦ ³Ñ±â´Â ¹æ½ÄÀ¸·Î ¹öư¿¡ ´ëÇÑ Äڵ带 ½ÇÇàÇÑ´Ù.

http://www.trolltech.com/products/qt/whitepaper/abstract-connections.png

½Ã±×³Î ½½·ÔÀ» ÅëÇÑ °´Ã¼ ¿¬°á¿¡ ´ëÇÑ °³·«ÀûÀÎ ±×¸²

QTÀÇ ½Ã±×³Î ½½·ÔÀº Äݹé°ú´Â ´Ù¸¥ ¸ÅÄ¿´ÏÁòÀ» »ç¿ëÇÑ´Ù. QTÀ§Á¬Àº À̺¥Æ®¸¦ °¨ÁöÇÏ¸é ½Ã±×³ÎÀ» ¹ß»ý½ÃŲ´Ù. ¹öưÀ» Ŭ¸¯ÇßÀ» ¶§ Ŭ¸¯ ½Ã±×³ÎÀ» ¹ß»ý½ÃŰ´Â ¿ø¸®´Ù. ÇÁ·Î±×·¡¸Ó´Â ÇØ´ç ½Ã±×³Î°ú ½Ã±×³Î¿¡ ¿¬°áµÉ ½½·Ô ÇÔ¼ö¸¦ connect()¸¦ ÅëÇØ ¿¬°á½Ãų ¼ö ÀÖ´Ù. QTÀÇ ½Ã±×³Î ½½·Ô ¸ÅÄ¿´ÏÁòÀº Ŭ·¡½º¿¡ ´ëÇÑ Á¤º¸¸¦ ÇÊ¿ä·Î ÇÏÁö ¾ÊÀ¸¸ç ¶§¹®¿¡ °³¹ßÀÚ´Â ¸Å¿ì ½±°Ô Àç»ç¿ë°¡´ÉÇÑ Å¬·¡½ºÀÇ »ý¼ºÀÌ °¡´ÉÇØ Áø´Ù. ½Ã±×³Î ½½·ÔÀº type-safeÇϸç Äݹ鿡¼­ ¹ß»ýÇÒ ¼ö ÀÖ´Â Ãæµ¹µé¿¡ ´ëÇØ¼­ ¾ÈÀüÇÏ´Ù.

¿¹¸¦ µé¾î¼­ Quit¹öưÀ» Ŭ¸¯ÇÒ°æ¿ì clicked()½Ã±×³ÎÀ» ¾ÖÇø®ÄÉÀ̼ÇÀÇ quit()½½·Ô¿¡ ¿¬°áÇϵµ·Ï ÇÑ´Ù. ±×·³ À¯Àú°¡ ¹öưÀ» Ŭ¸¯ÇßÀ» ¶§ quit()°¡ È£ÃâµÇ°í ¾ÖÇø®ÄÉÀ̼ÇÀº Á¾·áµÈ´Ù. À̰ÍÀº ´ÙÀ½°ú °°Àº °£´ÜÇÑ ÄÚµå·Î ±¸Çö°¡´ÉÇÏ´Ù.
connect(button, SIGNAL(clicked()), qApp, SLOT(quit())); 
 

½Ã±×³Î°ú ½½·ÔÀ» ÅëÇÑ °´Ã¼ ¿¬°áÀÇ ¿¹

½Ã±×³Î ½½·Ô µµ±¸´Â C++ÀÇ ¹®¹ýÀ» µû¸£¸ç C++°´Ã¼ÁöÇâÀÇ ¸ðµç ÀÕÁ¡À» ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ type-safeÀÌ¸ç ¿À¹ö·ÎµùÇÒ ¼ö ÀÖÀ¸¸ç, À籸Çö °¡´ÉÇÏ´Ù. ¶ÇÇÑ Å¬·¡½ºÀÇ public, private, protectedÁß ¾î´À ¼½¼Ç¿¡¶óµµ ¿Ã ¼ö ÀÖ´Ù.

4.1 ½Ã±×³Î ½½·Ô ¿¹Á¦

½Ã±×³Î ½½·ÔÀ» ÀÌ¿ëÇϰíÀÚ ÇÑ´Ù¸é Ŭ·¡½º´Â ¹Ýµå½Ã QObject³ª À̰ÍÀÇ ¼­ºêŬ·¡½ºÁß Çϳª·Î ºÎÅÍ »ó¼ÓµÇ¾î¾ß ÇÑ´Ù. ±×¸®°í Ŭ·¡½º Á¤ÀÇ¿¡ Q_OBJECT¸ÅÅ©·Î¸¦ Æ÷ÇÔ½ÃÄÑ¾ß ÇÑ´Ù. ½Ã±×³ÎÀº signals ¼½¼Ç¿¡ ¼±¾ðÇÏ°í ½½·ÔÀÇ °æ¿ì¿¡´Â public slots, protected slots, private slots ¼½¼ÇÁß Çϳª¿¡ ¼±¾ðÇÏ¸é µÈ´Ù.

´ÙÀ½Àº QObject ¼­ºê Ŭ·¡½º ¿¹Á¦´Ù.
class BankAccount : public QObject 
{ 
Q_OBJECT 
public: 
    BankAccount() { curBalance = 0; } 
    int balance() const { return curBalance; } 
public slots: 
    void setBalance( int newBalance ); 
 
signals: 
    void balanceChanged( int newBalance ); 
 
private: 
    int curBalance; 
} 
 

C++ Ŭ·¡½ºÀÇ Çü½ÄÀÌ ±×·¸µíÀÌ 'BankAccountµµ »ý¼ºÀÚ¸¦ °¡Áø´Ù. balnace()¸¦ ÅëÇØ¼­ °ªÀ» ¾ò¾î¿À°í setBalance()¸¦ ÅëÇØ¼­ °ªÀ» º¯°æÇÑ´Ù.

Ŭ·¡½º´Â balanceChanged()¶ó´Â ½Ã±×³ÎÀ» °¡Áø´Ù. À̰ÍÀº °ªÀÌ ¹Ù²î¾î½Î´Â°ÍÀ» ¾Ë·ÁÁÖ±â À§Çؼ­ »ç¿ëÇÑ´Ù. ½Ã±×³ÎÀ» ÅëÇØ¼­ °ªÀÌ ¹Ù²ï°ÍÀ» Àü¼ÛÇÏ¸é ¿¬°áµÈ ½½·ÔÀÌ ½ÇÇàµÈ´Ù.

½½·ÔÇÔ¼ö´Â public slots ¼½¼Ç¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù. ½½·ÔÀº ´Ù¸¥ ÇÔ¼öµé°ú ¸¶Âù°¡Áö·Î ±×³É È£ÃâµÉ ¼öµµ ÀÖÀ¸¸ç ¿¬°áµÈ ½Ã±×³Î¿¡ ÀÇÇØ¼­ È£ÃâµÉ ¼öµµ ÀÖ´Ù.

´ÙÀ½Àº setBalance()½½·ÔÀÇ Á¤ÀÇ´Ù.
void BankAccount::setBalance( int newBalance ) 
{ 
    if ( newBalance != curBalance ) { 
        curBalance = newBalance; 
        emit balanceChanged( curBalance ); 
    } 
} 
 
causes the balanceChanged() signal to be emitted with the new current balance as its argument. The keyword emit, like signals and slots, is provided by Qt and is transformed into standard C++ by the C++ preprocessor.

Here's an example of how to connect two BankAccounts:

BankAccount x, y;
connect( &x, SIGNAL(balanceChanged(int)), &y, SLOT(setBalance(int)) );
x.setBalance( 2450 );

When the balance in x is set to 2450, the balanceChanged() signal is emitted. The signal is received by y's setBalance() slot, which sets y's balance to 2450.

One object's signal can be connected to many different slots, and many signals can be connected to one slot in a particular object. Connections are made between signals and slots whose parameters have the same types. A slot can have fewer parameters than the signal and ignore the extra parameters.

4.2 Meta Object Compiler

½Ã±×³Î ½½·Ô ¸ÅÄ¿´ÏÁòÀº Ç¥ÁØ C++ÀÇ ±â´ÉµéÀ» ÀÌ¿ëÇÑ´Ù. À̰ÍÀ» ÀÌ¿äÇϱâ À§Çؼ­ C++ ÇÁ¸®ÇÁ·Î¼¼¼­¿Í QT ŸŶ¿¡ Æ÷ÇÔµÈ Meta Object Compiler(moc)À» »ç¿ëÇÑ´Ù.

moc´Â ¾ÖÇø®ÄÉÀ̼ÇÀÇ Çì´õÆÄÀÏÀ» Àо ½Ã±×³Î ½½·Ô ¸ÅÄ¿´ÏÁòÀÇ Áö¿øÀÌ °¡´ÉÇÑ Äڵ带 »ý¼º½ÃÄÑÁØ´Ù. »ó´çÈ÷ »ý¼ÒÇÒÁö ¸ð¸£°ÚÁö¸¸ qmake°¡ ÀÚµ¿ÀûÀ¸·Î »ý¼ºÀ» ÇØÁÖ´Ï °³¹ßÀÚ´Â ÄÚµåÀÛ¼º¿¡¸¸ ½Å°æ¾²¸é µÈ´Ù.

moc´Â ½Ã±×³Î ½½·ÔÀ» Á¦¾îÇϵµ·Ï Äڵ带 ¸¸µé¾îÁÖ´Â ÀÏ ¿Ü¿¡µµ QTÀÇ ¹ø¿ª ¸ÅÄ¿´ÏÁòÀ» Áö¿øÇÑ´Ù. moc´Â ½Ã½ºÅÛÀÇ Æ¯¼º°ú ½Ã½ºÅÛÀÇ Æ¯¼º¿¡ ÀÇÇØ¼­ È®ÀåµÇ´Â run-time type Á¤º¸µéÀ» ÀÌ¿ëÇØ¼­ ½Ã½ºÅÛ¿¡ ¸Â´Â Äڵ带 »ý¼ºÇÒ ¼ö ÀÖµµ·Ï Áö¿øÇÑ´Ù. ÀÌ·¯ÇÑ ¸ÅÄ¿´ÏÁòÀº ÇϳªÀÇ QTÄڵ带 ¼öÁ¤¾øÀÌ ´Ù¸¥ Ç÷¿Æû¿¡ ½±°Ô À̽İ¡´ÉÇϵµ·Ï µµ¿ÍÁØ´Ù.

5 GUI ¾ÖÇø®ÄÉÀÌ¼Ç Á¦ÀÛ

QT¸¦ ÀÌ¿ëÇÏ¸é ¼¼·ÃµÈ GUI¾ÖÇø®ÄÉÀ̼ÇÀ» Á¦ÀÛÇÒ ¼ö ÀÖ´Ù. °Ô´Ù°¡ GUIÈ­¸é Á¦ÀÛÀ» µµ¿ÍÁÖ´Â QT Designerµµ Àִµ¥, À̰ÍÀ» ÀÌ¿ëÇÏ¸é ºñÁê¾óÇÑ È¯°æ¿¡¼­ ¾ÖÇø®ÄÉÀ̼ÇÀ» Á¦ÀÛÇÒ ¼ö ÀÖ´Ù.

QT´Â ÃÖ½ÅÀÇ GUI¾ÖÇø®ÄÉÀ̼ÇÀ» ÀÛ¼ºÇϱâ À§ÇÑ ¸ðµç Ŭ·¡½º¿Í ÇÔ¼öµéÀ» Áö¿øÇϰí ÀÖ´Ù. QT´Â ¸Þ´º¹Ù, Åø¹Ù, »óÅÂ¹Ù¿Í Áß°£¿µ¿ª(¹®ÀÚ ÀÔ·ÂâÀÌ À§Ä¡ÇÏ´Â)À» °¡Áö´Â "main window" ½ºÅ¸ÀÏÀÇ ¾ÖÇø®ÄÉÀ̼ÇÀÇ Á¦ÀÛÀ» Áö¿øÇϸç, ¹öư°ú ¿É¼Ç, µµ¿ò¸», ÅǵîÀ¸·Î ±¸¼ºµÈ "dialog"½ºÅ¸ÀÏ ¾ÖÇø®ÄÉÀÌ¼Ç ¿ª½Ã Áö¿øÇÑ´Ù. ÃÖ½ÅÀÇ ÅøÅ¶ÀÌ ±×·¯ÇϵíÀÌ SDI¿Í MDI¿ª½Ã µå·¡±× ¾Ø µå·Ó, Ŭ¸³º¸µå¿ª½Ã Áö¿øÇÑ´Ù.

Åø¹Ù´Â µå·¡±× ½ÃÄѼ­ À§Ä¡¸¦ º¯°æÇϰųª µ¿¸³ÀûÀΠâÇü½ÄÀ¸·Î ¶ç¿ï ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ ±â´ÉµéÀ» ±¸ÇöÇϱâ À§Çؼ­ ÇÁ·Î±×·¡¸Ó´Â ¾î¶°ÇÑ ºÎ°¡ÀûÀÎ Äڵ带 ÀÛ¼ºÇÒ Çʿ䰡 ¾ø´Ù. QT¿¡¼­ ¾Ë¾Æ¼­ ó¸®ÇØÁØ´Ù.

QT´Â ¸Þ½ÃÁö ¹Ú½º¿Í À¯ÀúÀÇ Áú¹®, ÆÄÀÏ,ÆùÆ®,»öÀÇ ¼±ÅÃÀ» À§ÇÑ Ç¥ÁØ ´ëÈ­»óÀÚ¸¦ Áö¿øÇϸç, ¸îÁÙ Á¤µµ·Î °£ÆíÇÏ°Ô ÀÌµé ±â´ÉÀ» ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù.

5.1 Main Window

QMainWindow´Â ¸ÞÀÎ À©µµ¿ì¸¦ °¡Áö´Â ÀϹÝÀûÀÎ ¾ÖÇø®ÄÉÀÌ¼Ç Á¦ÀÛÀ» À§ÇÑ ÇÁ·¹ÀÓ¿öÅ©¸¦ Á¦°øÇÑ´Ù.


¸ÞÀÎ À©µµ¿ì´Â Ç¥ÁØÀûÀÎ À§Á¬ÀÇ ¼¼Æ®¸¦ Á¦°øÇÑ´Ù. ¸ÞÀÎÀ©µµ¿ìÀÇ À­ºÎºÐ¿¡´Â ¸Þ´º¹Ù, Åø¹Ù¿Í °°Àº À§Á¬ÀÌ À§Ä¡Çϰí, ¾Æ·§ºÎºÐÀº »óŹٰ¡ À§Ä¡ÇÑ´Ù.

Á»´õ Æí¸®ÇÑ À¯Àú ȯ°æÀ» Áö¿øÇϱâ À§Çؼ­ ÅøÆÁ°ú dz¼±µµ¿ò¸»µîµµ Áö¿øÇÑ´Ù.

SDI ¾ÖÇø®ÄÉÀ̼ÇÀÇ °æ¿ì QMainWindow À§Á¬¿¡ À§Ä¡Çϰí MDI ¾ÖÇø®ÄÉÀ̼ÇÀÇ °æ¿ì QWorkspace¿¡ Æ÷ÇԵȴÙ.

5.2 ¸Þ´º

QPopupMenuÀ§Á¬Àº ¼öÁ÷¹æÇâÀ¸·Î ¸Þ´º¾ÆÀÌÅÛÀÇ ¸ñ·ÏÀ» Ç¥½ÃÇÏ´Â À§Á¬ÀÌ´Ù. ÆË¾÷¸Þ´º´Â ÀÚü·Î »ç¿ëµÇ°Å³ª ¸Þ´º¹Ù¿¡ À§Ä¡ÇÒ ¼ö ÀÖÀ¸¸ç ´Ù¸¥ ÆË¾÷¸Þ´ºÀÇ ¼­ºê¸Þ´º·Îµµ »ç¿ëµÉ¼ö ÀÖ´Ù.

ÆË¾÷¸Þ´º¿¡ ÀÖ´Â °¢°¢ÀÇ ¸Þ´º ¾ÆÀÌÅÛÀº ¾ÆÀÌÄܰú, üũ¹Ú½º ±×¸®°í (´ÜÃàŰ)accelerator)¸¦ °¡Áö°í ÀÖ´Ù. À̿ܿ¡µµ ¾ÆÀÌÅÛ ¸ñ·ÏµéÀ» ±×·ìº°·Î ³ª´©¾î¼­ °ü¸®Çϱâ À§ÇÑ separator µµ Á¦°øÇÑ´Ù. À̰ÍÀº ¾ÆÀÌÅÛ ±×·ìµé »çÀ̸¦ ±¸ºÐÇÏ´Â ¼öÆòÀÇ ¼±ÇüÅ·ΠÁ¸ÀçÇØ¼­ ½Ã°¢ÀûÀ¸·Î ½±°Ô ±×·ì»çÀ̸¦ ±¸ºÐÇÒ ¼ö ÀÖµµ·Ï µµ¿Í ÁØ´Ù.

´ÙÀ½Àº New, Open, Exit ¸Þ´º ¾ÆÀÌÅÛÀ» Æ÷ÇÔÇÏ´Â ÆÄÀϸ޴º¸¦ »ý¼ºÇÏ´Â ¿¹Á¦ÄÚµå´Ù.
QPopupMenu *fileMenu = new QPopupMenu(this); 
fileMenu->insertItem("&New", this, SLOT(newFile()), CTRL+Key_N); 
fileMenu->insertItem("&Open...", this, SLOT(open()), CTRL+Key_O); 
fileMenu->insertSeparator(); 
fileMenu->insertItem("E&xit", qApp, SLOT(quit()), CTRL+Key_Q); 
 
¸Þ´º ¾ÆÀÌÅÛÀ» ¼±ÅÃ(Ŭ¸¯)ÇÏ¸é ½½·Ô¿¡ µî·ÏµÈ ÇÔ¼ö°¡ ½ÇÇàµÈ´Ù.

QMenuBar Ŭ·¡½º´Â ¸Þ´º¹Ù¸¦ ±¸¼ºÇϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. ÀÌ À§Á¬Àº »ý¼ºµÇ¸é ÀÚµ¿ÀûÀ¸·Î ºÎ¸ðÀ§Á¬(º¸Åë QMainWindow)ÀÇ °¡ÀåÀ§¿¡ ÀÚ¸®¸¦ Àâ°Ô µÈ´Ù. ¸¸¾à ºÎ¸ð À©µµ¿ì°¡ ¸Þ´º¹ÙÀÇ ¸ðµç ³»¿ëÀ» ´ã±â¿¡ ÃæºÐÈ÷ Å©Áö ¾Ê´Ù¸é ¸Þ´º¹Ù´Â ÀÚµ¿ÀûÀ¸·Î ¿©·¯°³ÀÇ ¶óÀÎÀ¸·Î ºÐ¸®µÇ¾î¼­ Ç¥½ÃµÈ´Ù. QT´Â ³»Àå ·¹À̾ƿô °ü¸®ÀÚ¸¦ °¡Áö°í Àִµ¥, ¾Ë¾Æ¼­ ¸Þ´º¹Ù¸¦ ´Ù¸¥ À§Á¬µé°ú Á¶È­µÇµµ·Ï ¸¸µé¾îÁØ´Ù.

´ÙÀ½Àº File, Edit, Help ¸Þ´º¸¦ Æ÷ÇÔÇÏ´Â ¸Þ´º¹ÙÀÇ ÄÚµå´Ù.
QMenuBar *bar = new QMenuBar(this);  
bar->insertItem("&File", fileMenu); 
bar->insertItem("&Edit", editMenu); 
bar->insertItem("&Help", helpMenu); 
 

QTÀÇ ¸Þ´º½Ã½ºÅÛÀº ¸Å¿ì À¯¿¬ÇÏ´Ù. ¸Þ´º ¾ÆÀÌÅÛÀº Ȱ¼ºÈ­,ºñȰ¼ºÈ­, Ãß°¡, »èÁ¦°¡ µ¿ÀûÀ¸·Î °¡´ÉÇϵµ·Ï µÇ¾î ÀÖ´Ù. ¶ÇÇÑ QCustomMenuItem ¼­ºêŬ·¡½º¸¦ ÀÌ¿ëÇØ¼­ »ç¿ëÀÚ Á¤ÀÇ °¡´ÉÇÑ ¸Þ´º ¾ÆÀÌÅÛµéÀ» ¸¸µé¾î ³¾ ¼ö ÀÖ´Ù.

5.3 Åø¹Ù

QToolButtonŬ·¡½º´Â ¾ÆÀÌÄÜ, 3DÇÁ·¹ÀÓ, ¶óº§À» °¡Áö´Â Åø¹Ù¸¦ Áö¿øÇÑ´Ù. Åä±Û(Toggle)Åø¹Ù ¹öưÀ» ÀÌ¿ëÇØ¼­ ¾î¶² ±â´ÉÀ» on,off ½ÃŰ°Å³ª, ¸í·ÉÀ» ½ÇÇà½ÃŰ´Â µîÀÇ ÀÏÀ»ÇÑ´Ù. »óÅ¿¡ µû¶ó¼­ ¾ÆÀÌÄÜÀ» Ȱ¼ºÈ­, ºñȰ¼ºÈ­, on, off½Ãų ¼ö ÀÖ´Ù.

QTollButtons´Â ÀϹÝÀûÀ¸·Î QTollBar°ú ÇÔ²² »ç¿ëµÈ´Ù. Åø¹Ù´Â QComboBox ¿Í QSpinBoxÀ» ºñ·ÔÇÑ ¸ðµç À§Á¬À» Æ÷ÇÔ½Ãų ¼ö ÀÖ´Ù.

5.4 dz¼± µµ¿ò¸»

ÃÖ±ÙÀÇ ¾ÖÇø®ÄÉÀ̼ÇÀº dz¼± µµ¿ò¸»À» °ÅÀÇ ÇʼöÀûÀ¸·Î Áö¿øÇÑ´Ù. À̰ÍÀº »ç¿ëÀÚ°¡ Åø¹ÙÀÇ ¾ÆÀÌÄܵ ¸¶¿ì½º¸¦ ´ë°í Àְųª ƯÁ¤ÇÑ ¹®ÀÚ¿¡ ¸¶¿ì½º¸¦ ´ë¸é °£´ÜÇÑ µµ¿ò¸»À» Ãâ·ÂÇØÁØ´Ù. QT´Â ÅøÆÁ(tooltips)°ú "What's this?" µÎ°¡Áö ÇüÅ·Πdz¼± µµ¿ò¸»À» Áö¿øÇÑ´Ù.

ÅøÆÁÀº ¸¶¿ì½º¸¦ À§Á¬À§¿¡ ¿Ã·Á ³õÀ¸¸é ÀÚµ¿ÀûÀ¸·Î °ü·Ã µµ¿ò¸»À» Ãâ·ÂÇÑ´Ù. ÀÌ·¯ÇÑ µµ¿ò¸»Àº ³ë¶õ»ö ¹ÙÅÁÀÇ »ç°¢Çü ¶óº§À§¿¡ Ãâ·ÂµÈ´Ù. À̿ܿ¡µµ Åø¹Ù¿¡ À§Ä¡ÇÏ´Â ¾ÆÀÌÄÜÀÇ ¼³¸íµîÀ» À§Çؼ­ »ç¿ëÇÑ´Ù. ÅøÆÁÀº ¾Æ·¡¿Í °°ÀÌ °£´ÜÇÏ°Ô ¸¸µé ¼ö ÀÖ´Ù.
QToolTip::add(saveButton, "Save File"); 
 
¶ÇÇÑ ÅøÆÁÀº »óŹÙ(status bar)¿¡ º¸À̵µ·Ï ÇÒ ¼ö ÀÖ´Ù.

"What's this?"´Â ÅøÆÁ°ú´Â ´Þ¸® »ç¿ëÀÚ°¡ ¿äûÀ» ÇØ¾ß¸¸ µµ¿ò¸»À» Ãâ·ÂÇÑ´Ù´Â °ÍÀ» Á¦¿ÜÇϰí´Â ÅøÆÁ°ú ºñ½ÁÇÏ´Ù. ¿¹¸¦ µé¾î Shift+F1À» ´©¸£°í À§Á¬À̳ª ¾ÆÀÌÄÜÀ» Ŭ¸¯ÇÏ¸é °Å±â¿¡ ´ëÇÑ µµ¿ò¸»ÀÌ Ãâ·ÂµÇ´Â Çü½ÄÀÌ´Ù. ´ÙÀ½Àº "Save"Åø¹Ù ¹öư¿¡ ´ëÇÑ "What's this?"µµ¿ò¸»À» ÀÛ¼ºÇÏ´Â ÄÚµå´Ù.
QWhatsThis::add( saveButton, "Saves the current file." ); 
 
QToolTip°ú QWhatsThis Ŭ·¡½º´Â °¡»óÇÔ¼ö¸¦ Áö¿øÇϸç, À̸¦ ÀÌ¿ëÇØ¼­ »ç¿ëÀÚ Á¤ÀÇ °¡´ÉÇÑ Æ¯¼öÇÑ ÇൿÀÌ °¡´ÉÇϵµ·Ï ÀçÀÛ¼ºÇÒ ¼ö ÀÖ´Ù.

5.5 Çൿ (Actions)

ÀϹÝÀûÀ¸·Î ¾ÖÇø®ÄÉÀ̼ÇÀº Ưº°ÇÑ Çൿ¿¡ ´ëÇØ¼­ ¿©·¯°¡Áö ¼öÇà¹æ¹ýÀ» Á¦°øÇÑ´Ù. ÆÄÀÏÀ» ÀúÀåÇÏ´Â ÇൿÀ» ¿¹·Î µé¾îº¸ÀÚ. ´ëºÎºÐÀÇ ¾ÖÇø®ÄÉÀ̼ÇÀº ÆÄÀÏ ÀúÀåÀÇ ¼öÇàÀ» À§Çؼ­ ¸Þ´º·ÎºÎÅÍ Save¸¦ ¼±ÅÃÇÏ´Â ¹æ¹ý°ú, Åø¹Ù·Î ºÎÅÍ ¼öÇàÇÏ´Â(Ç÷ÎÇÇ µð½ºÅ© ¸ð¾çÀÇ ¾ÆÀÌÄÜÀ» Ŭ¸¯)¹æ½Ä°ú Ctrl+S°ú °°Àº ´ÜÃà۸¦ ÀÌ¿ëÇÏ´Â ¹æ¹ýÀ» Á¦°øÇÑ´Ù. QActionŬ·¡½º´Â À§ÀÇ °ÍµéÀ» ĸ½¶È­ ÇØ¼­ Áö¿øÇÑ´Ù. ÇÁ·Î±×·¡¸Ó´Â ÇѹøÀÇ ÄÚµùÀ¸·Î °£´ÜÇÏ°Ô »ç¿ëÀÚ¿¡°Ô ¿©·¯°¡Áö Çൿ¹æ½ÄÀ» Áö¿øÇÒ ¼ö ÀÖ´Ù.

´ÙÀ½Àº SaveÇൿ¿¡ ´ëÇØ¼­ ¸Þ´º¾ÆÀÌÅÛ, Åø¹Ù¹öư, ´ÜÃàŰ, dz¼±µµ¿ò¸»À» ¸ðµÎ Áö¿øÇϵµ·Ï ¸¸µç ÄÚµå´Ù.
QAction *saveAct = new QAction( "Save", saveIcon, "&Save", 
                                    CTRL+Key_S, this ); 
connect( saveAct, SIGNAL(activated()), this, SLOT(save()) ); 
saveAct->setWhatsThis( "Saves the current file." ); 
saveAct->addTo( fileMenu ); 
saveAct->addTo( toolbar ); 
 
¿©·¯°³ÀÇ ÇൿµéÀ» Á¤ÀÇÇÏ´Ùº¸¸é ÇÁ·Î±×·¡¸ÓÀÇ ½Ç¼ö·Î Áߺ¹µÇ´Â °á°ú°¡ »ý±æ¼ö Àִµ¥, QActionÀº ¸Þ´º¾ÆÀÌÅÛ°ú Åø¹Ù »óÅÂÀÇ µ¿±âÈ­¸¦ ÅëÇØ¼­ ÀÌ·¯ÇÑ ½Ç¼ö¸¦ ¿¹¹æÇÑ´Ù.

5.6 Áß¾Ó À§Á¬(Central Widget)

QMainWindowÀÇ Áß¾Ó¿¡´Â ¾î¶°ÇÑ À§Á¬ÀÌ¶óµµ ¿Ã ¼ö ÀÖ´Ù. ¿¡µðÅÍ ÇÁ·Î±×·¥À» ¸¸µé±â ¿øÇÑ´Ù¸é ÅØ½ºÆ® ÀÔÃâ·ÂÀÌ °¡´ÉÇÑ QTextEdit°¡ Áß¾Ó À§Á¬À¸·Î »ç¿ëµÉ °ÍÀÌ´Ù.
QTextEdit *editor = new QTextEdit( mainWindow ); 
mainWindow->setCentralWidget( editor ); 
 

5.7 Multiple Document Interface

MDI´Â QWorkspaceŬ·¡½º¿¡ ÀÇÇØ¼­ Áö¿øµÈ´Ù. ÀÌ À§Á¬Àº º¸Åë QMainWindowÀÇ Áß¾Ó À§Á¬À¸·Î ÀÌ¿ëµÈ´Ù.

QWorkspaceÀÇ ÀÚ½Ä À§Á¬À¸·Î´Â ¾î¶°ÇÑ °ÍÀÌ¶óµµ ¿Ã ¼ö ÀÖ´Ù. show(), hide(), showMaximized(), setCaption()µî°ú °°Àº ¸Þ¼­µå¸¦ ÀÌ¿ëÇØ¼­ MDIÀÇ À§Á¬À» Á¦¾îÇÒ ¼ö ÀÖ´Ù.

QWorkspace´Â cascade¿Í tile¹æ½ÄÀÇ Á¤·ÄÀ» Áö¿øÇÑ´Ù. ¸¸¾à ÀÚ½Ä À§Á¬ÀÌ MID ¿µ¿ªÀ» ¹þ¾î³ª¸é ÀÚµ¿ÀûÀ¸·Î ½ºÅ©·Ñ¹Ù°¡ ³ªÅ¸³­´Ù. ÀÚ½Ä À§Á¬ÀÌ ÃÖ´ëÈ­ µÇ¾ú´Ù¸é ÀÚµ¿ÀûÀ¸·Î ¸Þ´º¹Ù¿¡ ÃÖ¼ÒÈ­ ¹öưÀÌ ³ªÅ¸³­´Ù.

5.8 ´ëÈ­»óÀÚ(Dialogs)

¸ðµç GUI¾ÖÇø®ÄÉÀ̼ÇÀº »ç¿ëÀÚ¿ÍÀÇ »óÈ£ÀÛ¿ëÀ» À§Çؼ­ ´ëÈ­»óÀÚ¸¦ Áö¿øÇÑ´Ù. QT´Â ¸ðµç ÀϹÝÀûÀÎ ´ëÈ­»óÀÚ¸¦ Á¦°øÇÑ´Ù.

´ÙÀ½Àº QT¿¡¼­ Áö¿øÇϴ ǥÁØ ´ëÈ­»óÀÚµéÀÇ ½ºÅ©¸°¼¦ÀÌ´Ù. ¾Æ·¡¿¡´Â ³ª¿ÍÀÖÁö ¾ÊÁö¸¸ QT´Â »ö¼±ÅÃ, ÇÁ¸°Æ® ¿É¼Ç ¼³Á¤À» À§ÇÑ ´ëÈ­»óÀڵ鵵 Á¦°øÇÑ´Ù.

http://www.trolltech.com/products/qt/whitepaper/qmessagebox.png border=0

QMessageBox

QMessageBox´Â ¼±Åÿ¡ °üÇÑ °£´ÜÇÑ ¹°À½À» »ç¿ëÀÚ¿¡°Ô º¸¿©ÁÖ°í ¼±ÅÃÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù.

http://www.trolltech.com/products/qt/whitepaper/qfiledialog.png

QFileDialog

QFileDialog´Â ÆÄÀϼ±Åà ´ëÈ­»óÀÚ´Ù. ½ºÅ©¸°¼¦¿¡¼­ º¼ ¼ö ÀÖ´Â °Íó·³ ´ÙÁßÀÇ ÆÄÀÏÀ» ¼±ÅÃÇÒ ¼ö ÀÖÀ¸¸ç, ·ÎÄûӸ¸ ¾Æ´Ï¶ó (FTP °°Àº)¿ø°ÝÆÄÀϵµ Áö¿øÇÑ´Ù. ÆÄÀÏÀÇ ¼±Åÿܿ¡µµ À̸§º¯°æ, µð·ºÅ丮 »ý¼º°ú °°Àº °£´ÜÇÑ ÆÄÀϰü·Ã ÀÛ¾÷µµ ÇÒ ¼ö ÀÖ´Ù. ´ëºÎºÐÀÇ QT´ëÈ­»óÀÚµéÀÌ ±×·¸µíÀÌ QFileDialogµµ Å©±âÀÇ Á¶ÀýÀÌ °¡´ÉÇÏ´Ù. ¾ÖÇø®ÄÉÀ̼ÇÀº °¢ ¿î¿µÃ¼Á¦¿¡ ¸Â´Â Àû´çÇÑ ´ëÈ­»óÀÚ¸¦ Ãâ·ÂÇÑ´Ù.

http://www.trolltech.com/products/qt/whitepaper/qprogressdialog.png

QProgressDialog

ÁøÇàÁ¤µµ¸¦ Ç¥½ÃÇϱâ À§Çؼ­ »ç¿ëÇÑ´Ù.

http://www.trolltech.com/products/qt/whitepaper/qwizard.png

QWizard

¸¶¹ý»çÅø

http://www.trolltech.com/products/qt/whitepaper/qfontdialog.png

QFontDialog

ÆùÆ® ¼±ÅÃÀ» À§ÇÑ ´ëÈ­»óÀÚ´Ù.

ÇÁ·Î±×·¡¸Ó´Â QT¿¡¼­ ±âº»ÀûÀ¸·Î Á¦°øÇÏ´Â ´ëÈ­»óÀÚ¿Ü¿¡µµ »ç¿ëÀÚ Á¤ÀÇ ´ëÈ­»óÀÚÀÇ Á¦ÀÛÀÌ °¡´ÉÇÏ´Ù. »ç¿ëÀÚ Á¤ÀÇ ´ëÈ­»óÀÚ´Â QWidget, QDialogµîÀÇ »ó¼Ó¿¡ ÀÇÇØ¼­ Á¦ÀÛÇÒ ¼ö ÀÖ´Ù.

5.9 Dock Windows

Dock windows are windows that the user can move inside a toolbar area or from one toolbar area to another. The user can undock a dock window and make it float on top of the application or minimize it. Dock windows and toolbar areas are provided by the QDockWindow and QDockArea classes.


Qt provides one QDockWindow subclass, QToolBar. QMainWindow automatically provides four toolbar areas, one on each side of the central widget.


Developers can create custom dock windows by instantiating a QDockWindow object and by adding widgets to it. The widgets are laid out side by side if the toolbar area is horizontal (e.g. at the top of the main window) and above each other if the area is vertical (e.g. at the left of the main window).


Dock areas are not bound to QMainWindow; developers can use QDockArea in any custom widget. Toolbars and other dock windows can be used with any toolbar area.


Some applications, including Qt Designer and Qt Linguist, use dock windows extensively. QDockArea provides operators to save and restore the position of dock windows, so that applications can easily restore the user's preferred positions.

5.10 Settings

¾ÖÇø®ÄÉÀ̼ÇÀ» ÀÛ¼ºÇÏ´Ù º¸¸é À¯ÀúÀÇ ¼³Á¤°ªµîÀ» º¯°æÇØ¾ß µÇ´Â °æ¿ì°¡ ÀÖ´Ù. ÀÌ·²°æ¿ì °£È¤ DB¸¦ »ç¿ëÇϱ⵵ ÇÏÁö¸¸ º¸ÅëÀº ÀÏ¹Ý ÆÄÀÏ¿¡ ÀúÀåÇÏ´Â °æ¿ì°¡ ´ëºÎºÐÀÌ´Ù. ÀÌ·¯ÇÑ ¼³Á¤ÀÛ¾÷À» À§Çؼ­ QSettings Ŭ·¡½º°¡ »ç¿ëµÈ´Ù. Ç÷§Æû¿¡ µû¶ó¼­ ÀúÀåÇÒ Àå¼Ò·Î ·¹Áö½ºÅ͸®¿Í ÀÏ¹Ý ÆÄÀÏÀ» ¼±ÅÃÇÒ ¼ö ÀÖ´Ù.

ÀϹÝÀûÀÎ ¼³Á¤ ÀúÀåÀº ۸¦ ÀÌ¿ëÇÏ´Â ¹æ¹ýÀÌ´Ù. ¿¹¸¦µé¾î SoftwareInc/RecentFilesµîÀ» Ű·Î ÇÏ°í ¿©±â¿¡ Àû´çÇÑ °ªÀ» ÀúÀåÇÏ´Â ¹æ½ÄÀÌ´Ù.
SoftwareInc=www.joinc.co.kr 
RecentFiles=wiki.html 
 
ÀúÀå °ªÀ¸·Î´Â ¼ýÀÚ, À¯´ÏÄÚµå ¹®ÀÚ, BooleansµîÀÌ »ç¿ëµÉ ¼ö ÀÖ´Ù.

5.11 ¸ÖƼ ¾²·¹µå

GUI¾ÖÇø®ÄÉÀ̼ÇÀº ƯÈ÷ ¸ÖƼ ¾²·¹µå¸¦ ÀÌ¿ëÇØ¾ßÇÏ´Â °æ¿ì°¡ ¸¹´Ù. ¸ÖƼ¾²·¹µå ÇÁ·Î±×·¡¹ÖÀ» ÇÒ°æ¿ì ÇÁ·Î±×·¡¸Ó´Â ¾²·¹µå°£ µ¥ÀÌÅÍ °øÀ¯¿Í ¾²·¹µå°£ µ¿±âÈ­µîÀ» À§Çؼ­ ¸¹Àº ³ë·ÂÀ» ÇØ¾ßÇϸç, ¸¹Àº ¼öÀÇ ¾²·¹µå ÇÔ¼ö¿¡ ´ëÇØ¼­ ¾Ë°íÀÖ¾î¾ß ÇÑ´Ù. QT´Â QThread, QMutex, QMutexLocker, QSemaphore¿Í QWaitCondition Ŭ·¡½º¸¦ Á¦°øÇÑ´Ù. À̵é Ŭ·¡½º´Â ³ôÀº ¼öÁØÀÇ Å¬·¡½ºµé·Î½á ÃÖ¼ÒÇÑÀÇ ³ë·ÂÀ¸·Î È¿°úÀûÀÎ ÄÚµåÀÇ ÀÛ¼ºÀÌ °¡´ÉÇϵµ·Ï µµ¿ÍÁØ´Ù.

6 QT °³¹ßµµ±¸µé

6.1 QT Designer

QTDesignerÀº QT·Î ÀÛ¼ºµÇ¾îÁø ºñÁê¾óÇÑ À¯ÀúÀÎÅÍÆäÀ̽º ¹× ÄÚµå ÀúÀÛÅøÀÌ´Ù. ÀÌ °ÍÀ» ÅëÇØ¼­ ¿ÏÀüÇÑ ¼Ò½ºÄÚµùÀÌ °¡´ÉÇϸç, ºü¸¥ °³¹ßÀÌ °¡´ÉÇØÁø´Ù.


QTDesignerÀ» ÀÌ¿ëÇÑ µðÀÚÀÎÀº Á÷°üÀûÀÌ°í °£´ÜÇÑ °úÁ¤À» µû¸¥´Ù. °³¹ßÀÚ´Â »ç¿ëÇϱ⠿øÇÏ´Â À§Á¬À» Ŭ¸¯ÇÑ´ÙÀ½¿¡ ¿øÇÏ´Â Àå¼Ò¿¡ À§Ä¡½Ã۰í À§Á¬ÀÇ Å©±â¸¦ (µå·¡±×¸¦ ÅëÇØ¼­) °áÁ¤Çϱ⸸ ÇÏ¸é µÈ´Ù. À§Á¬ÀÇ ¿©·¯°¡Áö Ư¡Àº property editorÀ» ÅëÇØ¼­ °áÁ¤ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î ¾î¶² ¹öư À§Á¬À» ¼±ÅÃÇß´Ù°í ÇÏÀÚ. ÀÌ ¹öưÀÇ À̸§À» Á¾·á·Î ÇÏ°í ½Í´Ù¸é property editorÀÇ text°ª¿¡ Á¾·á¸¦ ÀÔ·ÂÇϱ⸸ ÇÏ¸é µÈ´Ù. VC++°ú º¼·£µå C++ºô´õÀÇ ºñÁê¾óÇÑ È¯°æÀ» »ý°¢ÇÏ¸é µÉ°ÍÀÌ´Ù.

QTDesignerÀº ÀÎÅÍÆäÀ̽º µðÀÚÀÎÀ» À§Çؼ­ complie, link, run °úÁ¤ÀÌ ÇÊ¿ä ¾ø´Ù. ´«¿¡ º¸ÀÌ´Â ±×´ë·Î ½ÇÇàµÉ°ÍÀ̶ó´Â °ÍÀ» º¸ÀåÇϱ⠶§¹®ÀÌ´Ù. ÀÌ´Â ÀÎÅÍÆäÀ̽º µðÀÚÀο¡ °É¸®´Â ½Ã°£À» ȹ±âÀûÀ¸·Î ÁÙ¿©ÁØ´Ù. QTDesignerÀº ¹Ì¸®º¸±â ±â´ÉÀ» ÀÌ¿ëÇØ¼­ °³¹ßÀÚ°¡ ¸¸µç ÀÎÅÍÆäÀ̽º°¡ ´Ù¸¥ ½ºÅ¸ÀÏ¿¡¼­´Â ¾î¶»°Ô º¸ÀÏÁö¸¦ ¹Ì¸® º¸¿©ÁØ´Ù. ¿¹¸¦µé¾î À©µµ¿ì ȯ°æ¿¡¼­ ÀÎÅÍÆäÀ̽º¸¦ µðÀÚÀÎÇÏ´õ¶óµµ ¸ÅŲÅä½Ã³ª ¸®´ª½º¿¡¼­ ¾î¶»°Ô º¸¿©ÁúÁö¸¦ ¹Ì¸® È®ÀÎÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ QtÀÇ µ¥ÀÌÅͺ£À̽º Ŭ·¡½º¿Í ÅëÇյǾ µ¥ÀÌÅͺ£À̽ºÀÇ µ¥ÀÌÅ͸¦ ÆíÁýÇÏ°í ±× °á°ú¸¦ ¹Ì¸® È®ÀÎÇÒ ¼ö ÀÖµµ·Ï µÇ¾îÀÖ´Ù.

°³¹ßÀÚ´Â main window¿Í dialog½ºÅ¸ÀÏÀÇ ¾ÖÇø® ÄÉÀÌ¼Ç ¸ðµÎÀÇ °³¹ßÀÌ °¡´ÉÇÏ´Ù.

¿©·¯°¡Áö ÅÛÇø´À» Á¦°øÇϸç, °³¹ßÀÚ Á¤ÀÇµÈ ÅÛÇø´À» ¸¸µé ¼öµµ ÀÖ´Ù. ÀÌ ÅÛÇø´Àº ¾ÖÇø®ÄÉÀ̼ǿ¡ Åõ¸íÇÏ°Ô Àû¿ëµÈ´Ù. QTdesignerÀÇ ¸¶¹ý»ç(wizard)¸¦ ÀÌ¿ëÇϸé Åø¹Ù, ¸Þ´º, µ¥ÀÌÅͺ£À̽º ¾ÖÇø®ÄÉÀ̼ÇÀ» ºü¸£°í ½±°Ô Á¦ÀÛÇÒ ¼ö ÀÖ´Ù. ÇÁ·Î±×·¡¸Ó´Â ÀÚ½ÅÀÌ »ý¼ºÇÑ À§Á¬À» QTDesigner¿¡¼­ ½±°Ô ÅëÇÕÇÒ ¼ö ÀÖ´Ù.

QTDesignerÀº ÇÁ·ÎÁ§Æ® ±â¹ÝÀÇ ¾ÖÇø®ÄÉÀÌ¼Ç °³¹ß ȯ°æÀ» Áö¿øÇÑ´Ù. ÇÁ·ÎÁ§Æ®´Â a.proÇü½ÄÀ¸·Î ÀúÀåµÇ¸ç qmake¿¡ ÀÇÇØ¼­ makefile·Î º¯°æµÈ´Ù. °³¹ßÀÚ´Â ¿©±â¿¡ ÆûÀ» ´õÇÏ°í ¼Ò½ºÆÄÀÏÀ» Ãß°¡Çؼ­ ¿ÏÀüÇÑ ÇÁ·ÎÁ§Æ®·Î ¸¸µé ¼ö ÀÖ´Ù. QTDesignerÀ» ÀÌ¿ëÇÏ¸é °³¹ßÀÚ´Â ÄÚµå·Î ºÎÅÍ ÀÎÅÍÆäÀ̽º¸¦ ¿ÏÀüÈ÷ ºÐ¸® ½Ãų ¼ö ÀÖ´Ù.

¾ÆÀÌÄܰú ´Ù¸¥ À̹ÌÁöµéÀº ÇÁ·ÎÁ§Æ®µéÀÇ Æû¿¡¼­ ¸ðµÎ °øÀ¯µÇ¾î¼­ »ç¿ëµÈ´Ù. À̰ÍÀº ½ÇÇàÆÄÀÏÀÇ Å©±â¸¦ ÁÙÀ̰í Á»´õ »¡¸® ½ÇÇàµÉ ¼ö ÀÖµµ·Ï µµ¿ÍÁØ´Ù.

µðÀÚÀÎµÈ ÆûÀº .ulÆÄÀÏ·Î XMLÇü½ÄÀ¸·Î ÀúÀåµÈ´Ù. ÀÌ ÆÄÀÏÀº uic(User Interface Compiler)¿¡ À¸Çؼ­ C++Çì´õÆÄÀϰú ¼Ò½ºÆÄÀÏ·Î º¯°æµÈ´Ù. qmake´Â uic¸¦ À§ÇÑ ·êÀ» Æ÷ÇÔÇÑ makefileÀ» ÀÚµ¿ÀûÀ¸·Î »ý¼ºÇÑ´Ù. °³¹ßÀÚ´Â uicÀÇ »ç¿ë¹æ¹ýµî¿¡ ´ëÇØ¼­ ½Å°æ¾µ Çʿ䰡 ¾ø´Ù.

ÀϹÝÀûÀ¸·Î ÆûÀº ÄÄÆÄÀϵǾ ½ÇÇàÆÄÀÏÇüÅ·Π¸¸µé¾îÁø´Ù. ±×·¯³ª ¶§¶§·Î »ç¿ëÀÚ´Â ¼Ò½ºÄÚµåÀÇ ¿¢¼¼½º¾øÀÌ ¾ÖÇø®ÄÉÀ̼ÇÀÇ ¸ð¾çÀ» º¯°æÇϱ⸦ ¿øÇÏ´Â °æ¿ì°¡ ÀÖ´Ù. ÀÌ·²°æ¿ì¸¦ ´ëºñÇØ¼­ QT´Â dynamic dialog¸¦ Áö¿øÇÑ´Ù.. .uiÆÄÀÏÀº ½ÇÇà½Ã°£(run-time)¿¡ ÀÐÇô Áú¼ö ÀÖÀ¸¸ç µ¿ÀûÀ¸·Î ÆûÀÌ »ý¼ºµÈ´Ù. ¿¹¸¦µéÀÚ¸é °¢ ȸ»ç´Â °í°´ÀÇ Æ¯¼º¿¡ µû¶ó¼­ Àû´çÇÑ ÆûÀ» ¼Ò½ºÄÚµåÀÇ Á¦ÄÄÆÄÀÏÀ̳ª, ¹ÙÀ̳ʸ®ÀÇ º¯È¯¾øÀÌ .uiÆÄÀϸ¸ º¯°æÇØ ÁÜÀ¸·Î½á ¸¸µé¾î ÁÙ¼ö ÀÖ°Ô µÈ´Ù. dinamic dialog´Â ´ÙÀ½°ú °°Àº ¹æ¹ýÀ¸·Î ½±°Ô ¸¸µé¾î Áú ¼ö ÀÖ´Ù.
QDialog *creditForm = (QDialog *) 
                        QWidgetFactory::create("ucreditform.ui"); 
 

6.2 QT Assistant

QTDesignerÀº QT Assistant¶ó´Â ¿Â¶óÀÎ µµ¿ò¸» ¾ÖÇø®ÄÉÀ̼ÇÀ» Áö¿øÇÑ´Ù. QT Assistant´Â QTÀÇ ¸ðµç ¹®¼­µéÀ» Æ÷ÇÔÇϸç, À¥ºê¶ó¿ìÀú¿Í ºñ½ÁÇÑ ¸ð½ÀÀ¸·Î º¸¿©ÁØ´Ù. ±×·¯³ª À¥ºê¶ó¿ìÀú¿¡¼­´Â Áö¿øÇÏÁö ¾Ê´Â full text °Ë»öÀ» Áö¿øÇÑ´Ù.

QTÀÇ ·¹ÆÛ·±½º ¹®¼­´Â 1,600ÆäÀÌÁö¿¡ ´ÞÇϸç, ¿©±â¿¡´Â QTÀÇ Å¬·¡½º¿Í µµ±¸µé overviews, QTÇÁ·Î±×·¡¹Ö¿¡ ´ëÇÑ ´Ù¾çÇÑ ¼Ò°³µîÀÇ ³»¿ëÀ» ´ã°í ÀÖ´Ù.


°³¹ßÀÚ´Â QT Assistant µµ¿ò¸» ºê¶ó¿ìÀú¸¦ Á¦ÀÛÇÑ ¾ÖÇø®ÄÉÀ̼ÇÀ̳ª ¹®¼­µî¿¡ ¹èÄ¡½Ãų¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ ÀÏÀº QAssistantClient Ŭ·¡½º¸¦ ÀÌ¿ëÇØ¼­ °¡´ÉÇØÁø´Ù. QT Assistant´Â QTÀÇ HTML·¹ÆÛ·±½º ¹®¼­¸¦ QTextEdit¸¦ ÀÌ¿ëÇØ¼­ ·»´õ¸µ ½ÃŲ´Ù. °³¹ßÀÚ´Â ÀÌ Å¬·¡½º¸¦ ÀÌ¿ëÇØ¼­ ÀڽŸ¸ÀÇ µµ¿ò¸» ºê¶ó¿ìÀú¸¦ ¸¸µé ¼öµµ ÀÖ´Ù. QTextEdit´Â HTML 3.2¸¦ Áö¿øÇϸç QStyleSheet Ŭ·¡½º¸¦ ÀÌ¿ëÇØ¼­ »ç¿ëÀÚ Á¤ÀÇ Å±׸¦ ¸¸µé ¼öµµ ÀÖ´Ù.

7 GUI ¾ÖÇø®ÄÉÀÌ¼Ç ¿¹Á¦

À§ÀÇ ÀÀ¿ëÀº °èÃþÀû ±¸Á¶¸¦ º¸¿©ÁÖ´Â Hierarchy ÇÁ·Î±×·¥ÀÌ´Ù.

À§ÀÇ ±¸ÇöÀ» À§ÇÑ ¿ÏÀüÇÑ ¼Ò½ºÅ©µå´Â ¾Æ·¡¿¡ Á¦°øµÇ°í ÀÖ´Ù. main.cpp ÆÄÀÏÀº QT DEsigner wizard¿¡ ÀÇÇØ¼­ »ý¼ºµÇ¾ú´Ù.

addSearchPath(), removeSearchPath(), updateHierarchy()ÇÔ¼ö´Â ¸ðµÎ ½½·ÔÀ¸·Î QT Designer¿¡ ÀÇÇØ¼­ »ý¼ºµÈ ¹öưÀ» ÅëÇØ¼­ ¿¬°áµÈ´Ù.

void ClassHierarchy::addSearchPath() 
{ 
    QString path = QFileDialog::getExistingDirectory( 
            QDir::homeDirPath(), this, 0, "Select a Directory" ); 
    if ( !path.isEmpty() && searchPathBox->findItem(path, ExactMatch) == 0 ) 
        searchPathBox->insertItem( path ); 
} 
void ClassHierarchy::removeSearchPath() 
{ 
    searchPathBox->removeItem( searchPathBox->currentItem() ); 
} 
 
void ClassHierarchy::updateHierarchy() 
{ 
    QString fileNameFilter; 
    QRegExp classDef; 
 
    if ( language->currentText() == "C++" ) { 
        fileNameFilter = "*.h"; 
        classDef.setPattern( "\\bclass\\s+([A-Z_a-z0-9]+)\\s*" 
                             "(?:\\{|:\\s*public\\s+([A-Z_a-z0-9]+))" ); 
    } else if ( language->currentText() == "Java" ) { 
        fileNameFilter = "*.java"; 
        classDef.setPattern( "\\bclass\\s+([A-Z_a-z0-9]+)\\s+extends\\s*" 
                             "([A-Z_a-z0-9]+)" ); 
    } 
 
    dict.clear(); 
    listView->clear(); 
 
    for ( int i = 0; i < searchPathBox->count(); i++ ) { 
        QDir dir = searchPathBox->text( i ); 
        QStringList names = dir.entryList( fileNameFilter ); 
 
        for ( int j = 0; j < names.count(); j++ ) { 
            QFile file( dir.filePath(names[j]) ); 
            if ( file.open(IO_ReadOnly) ) { 
                QString content = file.readAll(); 
                int k = 0; 
                while ( (k = classDef.search(content, k)) != -1 ) { 
                    processClassDef( classDef.cap(1), classDef.cap(2), names[j] ); 
                    k++; 
                } 
            } 
        } 
    } 
} 
 
void ClassHierarchy::processClassDef( const QString& derived, 
        const QString& base, const QString& sourceFile ) 
{ 
    QListViewItem *derivedItem = insertClass( derived, sourceFile ); 
 
    if ( !base.isEmpty() ) { 
        QListViewItem *baseItem = insertClass( base, "" ); 
        if ( derivedItem->parent() == 0 ) { 
            listView->takeItem( derivedItem ); 
            baseItem->insertItem( derivedItem ); 
            derivedItem->setText( 1, sourceFile ); 
        } 
    } 
} 
 
QListViewItem *ClassHierarchy::insertClass( const QString& name, 
                                            const QString& sourceFile ) 
{ 
    if ( dict[name] == 0 ) { 
        QListViewItem *item = new QListViewItem( listView, name, sourceFile ); 
        item->setOpen( true ); 
        dict.insert( name, item ); 
    } 
    return dict[name]; 
} 
 
QT Designer¿¡ °üÇÑ ³»¿ëÀº http://doc.trolltech.com/3.1/designer-manual.html ¸¦ Âü°íÇϱ⠹ٶõ´Ù.

8 2D¿Í 3D ±×·¡ÇÈ

QT´Â 2D¿Í 3D ±×·¡ÇÈÀ» Áö¿øÇÑ´Ù. QTÀÇ 2D±×·¡ÇȰü·Ã Ŭ·¡½ºµéÀº bitmap°ú vector ±×·¡ÇÈÀ» Áö¿øÇÑ´Ù. ¶ÇÇÑ ¾Ö´Ï¸ÞÀ̼ǰú Ãæµ¹°ËÃâ(collision detection)°ú °°Àº °Íµé ¿ª½Ã Áö¿øÇÑ´Ù. 3D¸¦ À§Çؼ­´Â OpenGLÀ» ÀÌ¿ëÇÔÀ¸·Î½á Ç÷§Æû¿¡ Á¾¼ÓÀûÀÌÁö ¾ÊÀº ±×·¡ÇȰü·Ã ÇÁ·Î±×·¥ÀÇ °³¹ßÀÌ °¡´ÉÇÏ´Ù.

8.1 2D ±×·¡ÇÈ

Images

QImage Ŭ·¡½º´Â BMP, GIF, JPEG, MING, PNG, PNM, XBM, XPM°ú °°Àº ´Ù¾çÇÑ À̹ÌÁö Æ÷Ĺ¿¡ ´ëÇÑ ÀÔ·Â/Ãâ·Â°ú ÆíÁý±â´ÉÀ» Á¦°øÇÑ´Ù.

¸¹Àº QTÀÇ ³»ÀåÀ§Á¬µéÀÌ À̹ÌÁö¸¦ Ãâ·ÂÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î ¹öÅÏ, ¶óº§, ¸Þ´º ¾ÆÀÌÅÛµîÀÌ ±×°ÍÀε¥, »ç¿ëÀÚ¿¡°Ô Á»´õ Á÷°üÀûÀΠȯ°æÀ» Á¦°øÇϱâ À§Çؼ­ À̹ÌÁö¸¦ Ãâ·ÂÇÒ ¼öµµ ÀÖ´Ù.
QPushButton *button = new QPushButton( "&Find Address", parent ); 
button->setIconSet( QIconSet(QImage("find.bmp")) ); 
 
<img src=http://www.trolltech.com/products/qt/whitepaper/icon.png> 
 

QImage´Â 1, 8, 32 ºñÆ®ÀÇ »ö»óÀ» Áö¿øÇÑ´Ù. ÇÁ·Î±×·¡¸Ó´Â ÇÈ»ø°ú ÆÈ·¿Æ® µ¥ÀÌÅ͸¦ ¼öÁ¤ÇÒ ¼ö ÀÖÀ¸¸ç, ȸÀü, º¯Çü, »ö»óÁÙÀ̱â¿Í °°Àº ÀÛ¾÷À» ÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ alpha ä³ÎÀ» ÀÌ¿ëÇØ¼­ alpha-blending¿Í Åõ¸í¹è°æ°ú °°Àº °ÍµéÀÇ ±¸Çöµµ °¡´ÉÇÏ´Ù.

QMovieŬ·¡½º¸¦ ÀÌ¿ëÇÏ¸é ¾Ö´Ï¸ÞÀÌ¼Ç À̹ÌÁö¸¦ Ç÷¹ÀÌ ÇÒ ¼öµµ ÀÖ´Ù.

Painting

QPainterÀº Ç÷§Æû µ¶¸³ÀûÀÎ ÆÐÀÎÆÃ À§Á¬À» À§ÇÑ API¸¦ Á¦°øÇÑ´Ù. ±âº»ÀûÀÎ ÆÐÀÎÆÃ °ü·Ã ±â´É¿Ü¿¡µµ º¯È¯(transformation)°ú ÀÚ¸£±â(clipping)¿Í °°Àº ¹ßÀüµÈ ±â´Éµµ Á¦°øÇÑ´Ù. ¸ðµç QT ³»Àå À§Á¬Àº QPainterÀ» ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù. ÇÁ·Î±×·¡¸Ó°¡ ÀÚ½ÅÀÇ À§Á¬À» ¸¸µé ¶§µµ QPinaterÀº À¯¿ëÇÏ°Ô »ç¿ëµÈ´Ù.

QPainterÀº Á¡,¼±,´Ù°¢Çü,¿ø,º£Áö¾î °î¼±µîÀ» ±×¸®±â À§ÇÑ Ç¥ÁØÀûÀÎ ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù. ¸¸¾à 2-pixelÀÇ µÎ±ú¸¦ °¡Áö´Â »¡°£ ¼±À¸·Î ÀÌ·ç¾îÁø 120 x 60 Å©±âÀÇ »ç°¢ÇüÀ» 25,15 ÁÂÇ¥¿¡ ±×¸®°í ½Í´Ù¸é ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µÈ´Ù.
painter.setPen( QPen(red, 2, DashLine) ); 
painter.drawRect( 25, 15, 120, 60 ); 
 
±âº»ÀûÀ¸·Î À§Á¬¿¡¼­ ±âÁØÀÌ µÇ´ÂÁöÁ¡Àº ¿ÞÂÊ À§·Î 0,0ÁÂÇ¥°¡ µÈ´Ù. ¹Ý´ëÀÇ ¿À¸¥ÂÊ ¾Æ·¡ ÁÂÇ¥´Â witdh()-1, height()-1ÀÌ µÈ´Ù.

´ÙÀ½Àº bar-graph »ç¿ëÀÚ À§Á¬À» À§ÇÑ ÄÚµå´Ù. ÄÚµå´Â QPainterÀÇ paintEvent()¸¦ ÀÌ¿ëÇØ¼­ ¸¸µé¾î Á³´Ù.
void BarGraph::paintEvent( QPaintEvent * ) 
{ 
    QPainter painter( this ); 
 
    draw_bar( &painter, 0, 39, Qt::DiagCrossPattern ); 
    draw_bar( &painter, 1, 31, Qt::BDiagPattern ); 
    draw_bar( &painter, 2, 44, Qt::FDiagPattern ); 
    draw_bar( &painter, 3, 68, Qt::SolidPattern ); 
 
    painter.setPen( black ); 
    painter.drawLine( 0, 0, 0, height() - 1 ); 
    painter.drawLine( 0, height() - 1, width() - 1, height() - 1 ); 
 
    painter.setFont( QFont("Helvetica", 18) ); 
    painter.drawText( rect(), AlignHCenter | AlignTop, "Sales" ); 
} 
 
void BarGraph::draw_bar( QPainter *painter, int month, int barHeight, 
                         BrushStyle pattern ) 
{ 
    painter->setPen( blue ); 
    painter->setBrush( QBrush(darkGreen, pattern) ); 
    painter->drawRect( 10 + 30 * month, height() - barHeight, 20, 
                       barHeight ); 
} 
 

ÀÌ À§Á¬Àº width(), height()¸¦ ÀÌ¿ëÇØ¼­ ÁÂÇ¥¸¦ °áÁ¤ÇϹǷΠÀ©µµ¿ìÀÇ Å©±â°¡ º¯ÇÏ´õ¶óµµ Á¤È®ÇÏ°Ô Ç¥ÇöµÈ´Ù.

QPainter´Â ÇÕÁýÇÕ(uniting), ±³ÁýÇÕ(intersection), Â÷ÁýÇÕ(subtractin), XOR µîÀ» Áö¿øÇϸç À̰ÍÀ» ÀÌ¿ëÇϸé, »ç°¢Çü, ¿ø, ºñÆ®¸Êµé°£ÀÇ °ãÄ¡´Â ºÎºÐ¿¡ ´ëÇÑ ¼Õ½¬¿î Ç¥ÇöÀÌ °¡´ÉÇØ Áø´Ù.

Paing Devices


8.2 3D ±×·¡ÇÈ

OpenGLÀº 3D ÇÁ·Î±×·¡¹ÖÀ» À§ÇÑ Ç¥ÁØ API´Ù. QT´Â QWidgetÀÇ ¼­ºê À§Á¬ÀÎ QGLWidgetÀ» Á¦°øÇϴµ¥ À̰ÍÀ» ÀÌ¿ëÇØ¼­ 3D ±×·¡ÇÈÀ» Áö¿øÇÏ´Â ¾ÖÇø®ÄÉÀ̼ÇÀ» Á¦ÀÛÇÒ ¼ö ÀÖ´Ù.

QTÀÇ OpengGL ¸ðµâÀº Windows, X11, Macintosh ÀÇ ½Ã½ºÅÛÀÌ Á¦°øÇÏ´Â OpenGL¶óÀ̺귯¸®(¶Ç´Â Mesa)¸¦ ÀÌ¿ëÇØ¼­ ÀÌ·¯ÇÑ 3D¸¦ Áö¿øÇÑ´Ù.
<img src=http://www.trolltech.com/products/qt/whitepaper/brain-innovation.png> 
 

´ÙÀ½Àº QT¸¦ ÀÌ¿ëÇÑ 3D ±×·¡ÇÈ ¿¹Á¦´Ù.

´ÙÀ½Àº ¿¹Á¦¸¦ À§ÇÑ ¿ÏÀüÇÑ ÄÚµå´Ù. ÀÌ ÇÁ·Î±×·¥Àº 3D »óÀÚ¸¦ ±×¸®´Âµ¥, 3°³ÀÇ ½½¶óÀÌµå ¹Ù¸¦ ÀÌ¿ëÇØ¼­ ¹Ú½º¸¦ X, Y, ZÃàÀ¸·Î ȸÀü ½Ãų ¼ö ÀÖ´Ù.

´ÙÀ½Àº box3d.h ÆÄÀÏÀÌ´Ù.
#include <qgl.h> 
 
class Box3D : public QGLWidget 
{ 
    Q_OBJECT 
public: 
    Box3D( QWidget *parent = 0, const char *name = 0 ); 
    ~Box3D(); 
 
public slots: 
    void setRotationX( int deg ) { rotX = deg; updateGL(); } 
    void setRotationY( int deg ) { rotY = deg; updateGL(); } 
    void setRotationZ( int deg ) { rotZ = deg; updateGL(); } 
 
protected: 
    virtual void initializeGL(); 
    virtual void paintGL(); 
    virtual void resizeGL( int w, int h ); 
    virtual GLuint makeObject(); 
 
private: 
    GLuint object; 
    GLfloat rotX, rotY, rotZ; 
}; 
 

´ÙÀ½Àº box3d.cpp ÆÄÀÏ·Î box3d.h¿¡ ¼±¾ðµÈ ¼±¾ðµÈ ÇÔ¼öµéÀÇ Á¤Àǰ¡ µÇ¾î ÀÖ´Ù.
#include "box3d.h" 
 
Box3D::Box3D( QWidget *parent, const char *name ) 
    : QGLWidget( parent, name ) 
{ 
    object = 0; 
    rotX = rotY = rotZ = 0.0; 
} 
 
Box3D::~Box3D() 
{ 
    makeCurrent(); 
    glDeleteLists( object, 1 ); 
} 
 
void Box3D::initializeGL() 
{ 
    qglClearColor( darkBlue ); 
    object = makeObject(); 
    glShadeModel( GL_FLAT ); 
} 
 
void Box3D::paintGL() 
{ 
    glClear( GL_COLOR_BUFFER_BIT ); 
    glLoadIdentity(); 
    glTranslatef( 0.0, 0.0, -10.0 ); 
    glRotatef( rotX, 1.0, 0.0, 0.0 ); 
    glRotatef( rotY, 0.0, 1.0, 0.0 ); 
    glRotatef( rotZ, 0.0, 0.0, 1.0 ); 
    glCallList( object ); 
} 
 
void Box3D::resizeGL( int w, int h ) 
{ 
    glViewport( 0, 0, w, h ); 
    glMatrixMode( GL_PROJECTION ); 
    glLoadIdentity(); 
    glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 15.0 ); 
    glMatrixMode( GL_MODELVIEW ); 
} 
 
GLuint Box3D::makeObject() 
{ 
    GLuint list = glGenLists( 1 ); 
    glNewList( list, GL_COMPILE ); 
    qglColor( yellow ); 
    glLineWidth( 2.0 ); 
 
    glBegin( GL_LINE_LOOP ); 
    glVertex3f( +1.5, +1.0, +0.8 ); 
    glVertex3f( +1.5, +1.0, -0.8 ); 
    /* ... */ 
    glEnd(); 
 
    glEndList(); 
    return list; 
} 
 

´ÙÀ½Àº main.cpp ÆÄÀÏ·Î Box3DÀÇ ÀνºÅϽº¸¦ »ý¼ºÇÑ´Ù.
#include <qapplication.h> 
#include <qslider.h> 
#include <qvbox.h> 
 
#include "box3d.h" 
 
void create_slider( QWidget *parent, Box3D *box3d, const char *slot ) 
{ 
    QSlider *slider = new QSlider( 0, 360, 60, 0, 
            QSlider::Horizontal, parent ); 
    slider->setTickmarks( QSlider::Below ); 
    QObject::connect( slider, SIGNAL(valueChanged(int)), box3d, slot ); 
} 
 
int main( int argc, char **argv ) 
{ 
    QApplication::setColorSpec( QApplication::CustomColor ); 
    QApplication app( argc, argv ); 
    if ( !QGLFormat::hasOpenGL() ) 
        qFatal( "This system has no OpenGL support" ); 
 
    QVBox *parent = new QVBox; 
    parent->setCaption( "OpenGL Box" ); 
    parent->setMargin( 11 ); 
    parent->setSpacing( 6 ); 
    Box3D *box3d = new Box3D( parent ); 
    create_slider( parent, box3d, SLOT(setRotationX(int)) ); 
    create_slider( parent, box3d, SLOT(setRotationY(int)) ); 
    create_slider( parent, box3d, SLOT(setRotationZ(int)) ); 
 
    app.setMainWidget( parent ); 
    parent->resize( 250, 250 ); 
    parent->show(); 
    return app.exec(); 
} 
 

9 Database

QT SQL¸ðµâÀº ´ÙÁß Ç÷§Æû¿¡¼­ SQL µ¥ÀÌÅͺ£À̽º¸¦ ¾×¼¼½ºÇϱâ À§ÇÑ ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÑ´Ù. QT´Â Oracle, Microsoft SQL ¼­¹ö, Sysbase Adaptive Server, PostgreSQL, MySQL, ODBC¸¦ À§ÇÑ µå¶óÀ̹ö¸¦ Æ÷ÇÔÇϰí ÀÖ´Ù. ÀÌ µå¶óÀ̹öµéÀº Ç÷§Æû¿¡ °ü°è¾øÀÌ QT´Â ¹°·ÐÀÌ°í ´Ù¸¥ ¶óÀ̺귯¸®ÀÀ¿ëÀ» À§Çؼ­µµ »ç¿ë°¡´ÉÇÏ´Ù.

ÇÁ·Î±×·¡¸Ó´Â SQLÀ» ½±°Ô ¿¢¼¼½ºÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. QT´Â C++ÀÎÅÍÆäÀ̽º¸¦ ÀÌ¿ëÇØ¼­ ³ôÀº ¼öÁØ¿¡¼­ ½±°Ô SQLÀ» ´Ù·ê ¼ö ÀÖµµ·Ï ÀϹÝÀûÀÎ »ç¿ë¹ýÀ» Á¦°øÇÑ´Ù.
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.