<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://old.wiki.ubuntu-kr.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=163.152.61.183</id>
	<title>Ubuntu Korea Community Wiki - 사용자 기여 [ko]</title>
	<link rel="self" type="application/atom+xml" href="https://old.wiki.ubuntu-kr.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=163.152.61.183"/>
	<link rel="alternate" type="text/html" href="https://old.wiki.ubuntu-kr.org/index.php?title=%ED%8A%B9%EC%88%98:%EA%B8%B0%EC%97%AC/163.152.61.183"/>
	<updated>2026-10-17T03:16:01Z</updated>
	<subtitle>사용자 기여</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://old.wiki.ubuntu-kr.org/index.php?title=GUI(QT)_Programming&amp;diff=2818</id>
		<title>GUI(QT) Programming</title>
		<link rel="alternate" type="text/html" href="https://old.wiki.ubuntu-kr.org/index.php?title=GUI(QT)_Programming&amp;diff=2818"/>
		<updated>2018-04-21T09:08:10Z</updated>

		<summary type="html">&lt;p&gt;163.152.61.183: /* 동적 배열 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== QT란 무엇인가? ==&lt;br /&gt;
* 리눅스나 유닉스에서 X-Window용 프로그램을 개발하려면 많은 지식이 필요하다.&lt;br /&gt;
* 다음과 같은 특징이 있다.&lt;br /&gt;
# C++ 기반 - 고급 언어들에 비해 어느정도 속도도 나오고, C에 비하면 좀더 모듈화가 되어 있어 확장이 용이&lt;br /&gt;
# 객체지향 - 라이브러리들이 모듈화가 잘 되어 있음&lt;br /&gt;
# 멀티플랫폼 - 다양한 플랫폼을 지원하고, 플랫폼이 바뀐다고 해서 전체를 싹 갈아엎지 않아도 된다.&lt;br /&gt;
# 시그널 &amp;amp; 슬롯 - 이벤트 처리 모델이 정형화되어 있다. 즉, 시그널 &amp;amp; 슬롯만 알면 콜백함수 등 실수할 여지가 줄어든다.&lt;br /&gt;
# Internationalization - 16비트 유니코드 완벽지원.&lt;br /&gt;
# API - 200개가 넘는 클래스를 지원한다. 웬만한 프로그램은 QT 안에 있는 라이브러리들로 해결 가능.&lt;br /&gt;
# 안정성 - 기업 베이스다. 개발은 아무나 할 수 있지만 커밋은 기업 내에서 이루어진다. 일반적으로 산으로 가는 프로젝트를 만들지 않는다.&lt;br /&gt;
&lt;br /&gt;
== QT 프로그램 구경하기 ==&lt;br /&gt;
* Youtube : https://www.youtube.com/watch?v=VsT1yKRKkXE&amp;amp;list=PLumkkj1MBmYs-WArrEkw2R6wO9Agj3FoX&lt;br /&gt;
* QT 프로그램은 Ubuntu의 경우 소프트웨어센터에서 설치할 수 있다.&lt;br /&gt;
[[파일:Qt_1_install.png]]&lt;br /&gt;
* 새 프로젝트(New Project)를 선택하면 다음과 같은 화면이 나온다.&lt;br /&gt;
[[파일:Qt_1_new.png]]&lt;br /&gt;
* 위젯 어플리케이션을 선택하면 다음과 같은 화면이 나온다.&lt;br /&gt;
* 프로젝트 이름을 정하고 컴파일 키트를 선택한다.&lt;br /&gt;
# 프로젝트 이름은 임의로 작성하고, 컴파일 키트는 기본 옵션으로 설정하면 된다.&lt;br /&gt;
* 클래스 설정 화면은 다음과 같다.&lt;br /&gt;
# Base Class를 다음과 같이 QDialog로 변경한다.&lt;br /&gt;
[[파일:Qt_1_new_1.png]]&lt;br /&gt;
* Github 등을 사용한다면 본인 계정 등을 설정하도록 한다. 이 내용은 [[QT/Github]] 항목을 참조.&lt;br /&gt;
* 여기서는 그냥 버전컨트롤 없이 진행해도 상관없다.&lt;br /&gt;
* Form에 *.ui 를 더블클릭하여 선택하면 다음과 같이 디자이너 모드로 변경된다.&lt;br /&gt;
* 어디서 많이 보던것 같지 않은가? Visual Studio의 편집 화면과 비슷하다. Microsoft Visual Studio를 사용해본 경험이 있다면 거의 비슷하게 사용할 수 있다.&lt;br /&gt;
[[파일:Qt_1_newWin_0.png]]&lt;br /&gt;
* 자, 이제 버튼과 텍스트박스를 집어넣어봅시다.&lt;br /&gt;
* 왼쪽에 있는 컴포넌트에서 드래그해서 넣을 수 있다.&lt;br /&gt;
[[파일:Qt_1_Intro_0.png]]&lt;br /&gt;
* PushButton의 이름을 바꾸는건 간단하다. PushButton 항목을 선택하고, 오른쪽 속성창의 값을 변경해주면 끝.&lt;br /&gt;
[[파일:Qt_1_Intro_1.png]]&lt;br /&gt;
* 화면 구성을 했으니 버튼에 이벤트를 넣어봅시다.&lt;br /&gt;
# 인사하기에서 우클릭을 하고 Go to Slot을 선택합니다.&lt;br /&gt;
[[파일:Qt_1_Intro_2.png]]&lt;br /&gt;
# Go to Slot을 선택하면 다음과 같은 내용이 나옵니다.&lt;br /&gt;
[[파일:Qt_1_Intro_2_1.png ]]&lt;br /&gt;
# Clicked를 선택하면 코드 입력 부분이 나오는데, 다음과 같이 입력합니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ui-&amp;gt;lineEdit-&amp;gt;setText(&amp;quot;Hello World&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
# 지우기 부분 코드&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ui-&amp;gt;lineEdit-&amp;gt;setText(&amp;quot;&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
# 종료하기 부분 코드&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
this.close();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 기본 문법 ==&lt;br /&gt;
=== 변수와 상수 사용하기 ===&lt;br /&gt;
* Youtube : https://www.youtube.com/watch?v=tHzPBCUi0G8&amp;amp;list=PLumkkj1MBmYs-WArrEkw2R6wO9Agj3FoX&lt;br /&gt;
* 변수는 프로그램 내에서 수시로 값이 (변)할수 있는 (수)를 말합니다. 반면에 상수는 항(상) 같은 값을 유지하는 (수)를 말하는거죠.&lt;br /&gt;
* 프로젝트를 하나 만들고 시작해 보겠습니다.&lt;br /&gt;
[[파일:Qt 1 pro 0.png]]&lt;br /&gt;
* C++의 경우 변수를 사용하기 위해서는 선언을 해야 합니다. 일반적으로 헤더파일에 선언을 하죠. 여기서는 data라는 변수를 추가해 보겠습니다.&lt;br /&gt;
* 또한, 값을 확인하기 위한 디버그 모듈을 사용할 것입니다.&lt;br /&gt;
* 헤더에 QDebug를 사용한다고 선언하고, 정수형 data를 미리 선언합니다.&lt;br /&gt;
[[파일:Qt_1_pro_1.png]]&lt;br /&gt;
* 그리고, 다이얼로그가 열릴 때 처리될 수 있도록 다음과 같이 코드를 넣어주면 됩니다.&lt;br /&gt;
* qDebug() 함수를 사용할 때, 앞에 q는 소문자임에 유의해 주세요. qDebug() 함수는 c++의 cout과 같은 기능을 한다고 보시면 됩니다.&lt;br /&gt;
* 실행하면 아래 디버그 창에 값이 출력되는걸 확인할 수 있습니다.&lt;br /&gt;
[[파일:Qt_1_pro_2.png]]&lt;br /&gt;
* 여기서 사용된 data는 사용자가 임의로 만들 수 있는 변수입니다. 변수는 프로그램 내에서 숫자나 문자 등을 보관하는 역할을 합니다.&lt;br /&gt;
* 변수는 필요에 따라 얼마든지 만들어 사용할 수 있습니다.&lt;br /&gt;
* = 기호는 수학의 등호가 아닙니다. 오른쪽의 값을 왼쪽의 변수에 기억시키는 (또는 할당하는) 연산자입니다.&lt;br /&gt;
* 위의 프로그램에서 data 변수는 처음에 100을 기억했다가 다시 200을 기억합니다.&lt;br /&gt;
* 이와 같이 변수는 다른 값을 가질 수 있습니다. 그래서 변수입니다.&lt;br /&gt;
* 그에 반해 100이나 200같은 숫자는 상수라고 합니다. 이 숫자들은 프로그램이 아무리 실행되어도 항상 100과 200을 유지합니다. 그래서 상수입니다.&lt;br /&gt;
* 이제 여러가지 형식의 변수를 선언하고 이용해보도록 하겠습니다.&lt;br /&gt;
[[파일:Qt_1_pro_3.png]]&lt;br /&gt;
[[파일:Qt_1_pro_4.png]]&lt;br /&gt;
* 정수형 변수 dataint는 정수를 기억합니다. 컴퓨터가 가장 빠른 연산을 할 수 있는 데이터형입니다.&lt;br /&gt;
* 실수형 변수 datadou는 소수점 이하의 수를 기억합니다. 내부적으로는 지수 형태로 기억하지만, 일반적으로 소숫점이 있는 수를 저장할 때 많이 사용합니다.&lt;br /&gt;
* 논리형 변수 databoo는 true와 false 논리 상수를 기억합니다. 일반적으로 flag같은 값을 많이들 저장합니다.&lt;br /&gt;
* 문자열형 변수 datastr은 할당할 문자열을 반드시 겹따옴표 사이에 기술해야 합니다. 문자열은 문자의 집합을 의미합니다.&lt;br /&gt;
* 변수의 종류를 말할 때 위와 같이 데이터형에 따라 정수형 변수, 실수형 변수, 문자열형 변수, ...와 같이 구분합니다. 근데 또 다른 관점에서 구분하는 경우도 있습니다.&lt;br /&gt;
* 변수가 영향을 미치는 유효 범위에 따라 다음과 같이 구분하기도 합니다.&lt;br /&gt;
# 프로시져 변수 - 프로시져(중괄호{}) 내부에 선언된 변수. 프로시져 안에서만 쓸 수 있다. 보통 지역변수라고들 많이 이야기한다.&lt;br /&gt;
# 모듈 변수 - 모듈(파일) 내부에 선언된 변수. 그 파일 안에서만 쓸 수 있다.&lt;br /&gt;
# 전역 변수 - 헤더파일에 Public으로 선언한 변수. 다른 모듈에서도 갖다 쓸 수 있다.&lt;br /&gt;
# 정적 변수 - 프로시져 내부에 Static으로 선언하는 변수. 프로시져가 종료되어도 값을 유지한다.&lt;br /&gt;
* 이에 대해 알아보기 위해 간단하게 프로그램을 하나 작성해보도록 하겠습니다.&lt;br /&gt;
[[파일:Qt_1_pro_5.png]]&lt;br /&gt;
[[파일:Qt_1_pro_6.png]]&lt;br /&gt;
* 위와 같이 해놓으면 에러가 발생할 것입니다.&lt;br /&gt;
* 이를 어떻게 해결하냐면, 이걸 헤더 내에 모듈 변수로 선언을 하면 됩니다.&lt;br /&gt;
* 실행해보면 제대로 출력되는걸 볼 수 있을겁니다.&lt;br /&gt;
[[파일:Qt_1_pro_7.png]]&lt;br /&gt;
[[파일:Qt_1_pro_8.png]]&lt;br /&gt;
* const라는 게 있습니다.&lt;br /&gt;
* 상수를 변수처럼 사용할 수 있게 만들어 주는거죠.&lt;br /&gt;
* 예를 들어, 파이값같은걸 쓴다치면, 계속 3.1415926이라는 값을 입력하면 귀찮으니, pi라는 변수처럼 생긴 놈 안에다가 그 값을 넣어두는 겁니다.&lt;br /&gt;
* const 선언을 하게 되면, 그 값을 바꿀 수 없습니다. Ansi-C에서는 #define이라는 전처리기(Preprocessor)를 사용했었는데, C++ 계열에서는 거의 대부분 const로 해결합니다. 이해도 쉽고, const를 쓰는게 좋습니다.&lt;br /&gt;
[[파일:Qt_1_pro_9_.png]]&lt;br /&gt;
[[파일:Qt_1_pro_10_.png]]&lt;br /&gt;
&lt;br /&gt;
=== 연산자 ===&lt;br /&gt;
* 다음과 같이 연산자를 사용할 수 있다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int data1;&lt;br /&gt;
int data2;&lt;br /&gt;
&lt;br /&gt;
data1 = 10;&lt;br /&gt;
data2 = 3;&lt;br /&gt;
&lt;br /&gt;
// 산술 연산&lt;br /&gt;
qDebug() &amp;lt;&amp;lt; &amp;quot;data1 + data2 = &amp;quot; &amp;lt;&amp;lt; data1 + data2;&lt;br /&gt;
qDebug() &amp;lt;&amp;lt; &amp;quot;data1 - data2 = &amp;quot; &amp;lt;&amp;lt; data1 - data2;&lt;br /&gt;
qDebug() &amp;lt;&amp;lt; &amp;quot;data1 * data2 = &amp;quot; &amp;lt;&amp;lt; data1 * data2;&lt;br /&gt;
qDebug() &amp;lt;&amp;lt; &amp;quot;data1 / data2 = &amp;quot; &amp;lt;&amp;lt; data1 / data2;&lt;br /&gt;
qDebug() &amp;lt;&amp;lt; &amp;quot;data1 % data2 = &amp;quot; &amp;lt;&amp;lt; data1 % data2;&lt;br /&gt;
&lt;br /&gt;
// 논리 연산&lt;br /&gt;
qDebug() &amp;lt;&amp;lt; QString(&amp;quot;(data1 &amp;lt; 11) &amp;amp;&amp;amp; (data2 &amp;gt; 2) = %1&amp;quot;).arg((data1 &amp;lt; 11) &amp;amp;&amp;amp; (data2 &amp;gt; 2));&lt;br /&gt;
qDebug() &amp;lt;&amp;lt; QString(&amp;quot;(data1 &amp;lt; 11) || (data2 &amp;lt; 2) = %1&amp;quot;).arg((data1 &amp;lt; 11) || (data2 &amp;lt; 2));&lt;br /&gt;
qDebug() &amp;lt;&amp;lt; QString(&amp;quot;!(data1 &amp;lt; 11) = %1&amp;quot;).arg(!(data1 &amp;lt; 11));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 조건문 ===&lt;br /&gt;
* Youtube : https://www.youtube.com/watch?v=b-mylI0gTY8&lt;br /&gt;
* if는 다음과 같이 사용할 수 있습니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
if(조건식) { 명령문; }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 1개의 조건문 예시&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int jumsu;&lt;br /&gt;
&lt;br /&gt;
jumsu = 50;&lt;br /&gt;
&lt;br /&gt;
if(jumsu &amp;lt; 60)&lt;br /&gt;
{&lt;br /&gt;
  qDebug() &amp;lt;&amp;lt; &amp;quot;낙제입니다&amp;quot;;&lt;br /&gt;
  qDebug() &amp;lt;&amp;lt; &amp;quot;재수강 신청하세요&amp;quot;;&lt;br /&gt;
  qDebug() &amp;lt;&amp;lt; &amp;quot;마감일은 12월 20일입니다&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
  qDebug() &amp;lt;&amp;lt; &amp;quot;낙제가 아닙니다&amp;quot;;&lt;br /&gt;
  qDebug() &amp;lt;&amp;lt; &amp;quot;재수강 신청하지 마세요&amp;quot;;&lt;br /&gt;
  qDebug() &amp;lt;&amp;lt; &amp;quot;마감일 신경쓰지 마세요&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
qDebug() &amp;lt;&amp;lt; &amp;quot;점수는 &amp;quot; &amp;lt;&amp;lt; jumsu &amp;lt;&amp;lt; &amp;quot;점 입니다.&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* elseif 예시&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int jumsu;&lt;br /&gt;
&lt;br /&gt;
jumsu = 50;&lt;br /&gt;
&lt;br /&gt;
if(jumsu &amp;gt;= 90)&lt;br /&gt;
{&lt;br /&gt;
  qDebug() &amp;lt;&amp;lt; &amp;quot;A 학점입니다.&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else if(jumsu &amp;gt;= 80)&lt;br /&gt;
{&lt;br /&gt;
  qDebug() &amp;lt;&amp;lt; &amp;quot;B 학점입니다.&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else if(jumsu &amp;gt;= 70)&lt;br /&gt;
{&lt;br /&gt;
  qDebug() &amp;lt;&amp;lt; &amp;quot;C 학점입니다.&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else if(jumsu &amp;gt;= 60)&lt;br /&gt;
{&lt;br /&gt;
  qDebug() &amp;lt;&amp;lt; &amp;quot;D 학점입니다.&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
else // elseif가 아님&lt;br /&gt;
{&lt;br /&gt;
  qDebug() &amp;lt;&amp;lt; &amp;quot;F 학점입니다.&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* switch 문은 일반적으로 enum과 함께 쓰입니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
enum weekday {&lt;br /&gt;
    Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int today, yesterday;&lt;br /&gt;
&lt;br /&gt;
today = Saturday;&lt;br /&gt;
&lt;br /&gt;
yesterday = today -1;&lt;br /&gt;
&lt;br /&gt;
switch(yesterday) {&lt;br /&gt;
    case Friday:&lt;br /&gt;
    case Saturday: qDebug() &amp;lt;&amp;lt; &amp;quot;Burning&amp;quot;; break;&lt;br /&gt;
    case Monday: qDebug() &amp;lt;&amp;lt; &amp;quot;What the Hell&amp;quot;; break;&lt;br /&gt;
    default:&lt;br /&gt;
        qDebug(&amp;quot;Groomy Working Day&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* enum은 위와 같이 사용합니다. 자세한 사용법은 구글님께.&lt;br /&gt;
&lt;br /&gt;
=== 반복문 ===&lt;br /&gt;
* for는 다음과 같이 사용합니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for(변수 = 초기값; 최종값에 대한 식; 변수를 어떻게 증감할건지)&lt;br /&gt;
{&lt;br /&gt;
  명령문들;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 예제를 하나 보도록 하죠.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
for(int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
{&lt;br /&gt;
  res += i;&lt;br /&gt;
  qDebug() &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &amp;quot;까지의 합은 &amp;quot; &amp;lt;&amp;lt; res &amp;lt;&amp;lt; &amp;quot;입니다.&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* do~while문은 다음과 같이 사용합니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
do&lt;br /&gt;
{&lt;br /&gt;
  명령문들;&lt;br /&gt;
} while (최종값에 대한 식);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 이것도 역시 예제를 위의 for와 같은걸 해보도록 하죠.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int i = 0; // 이처럼 변수 선언을 하면서 초기값을 설정할 수 있습니다.&lt;br /&gt;
do&lt;br /&gt;
{&lt;br /&gt;
  i++;&lt;br /&gt;
  res += i;&lt;br /&gt;
    qDebug() &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &amp;quot;까지의 합은 &amp;quot; &amp;lt;&amp;lt; res &amp;lt;&amp;lt; &amp;quot;입니다.&amp;quot;;&lt;br /&gt;
} while (i &amp;lt; 3);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 자, for문과 do~while문의 차이점은 뭘까요?&lt;br /&gt;
# for는 괄호 안에 모든 내용을 다 집어넣었지요? 사람들은 반복문을 사용할 때 for를 더 많이 사용하는 이유가 있지요.&lt;br /&gt;
# for는 루프 내에서만 사용되는 변수를 지정할 수 있습니다. while은 미리 변수를 선언해야 하고요.&lt;br /&gt;
# while은 또 한가지 유의할 점이 있습니다. *무조건* 한번은 프로시져가 실행된다는 점이죠.&lt;br /&gt;
=== 배열 ===&lt;br /&gt;
* 프로그램에서 데이터를 임시로 저장하기 위해서 변수를 사용한다는건 아실겁니다.&lt;br /&gt;
* 그런데 변수중에 '배열'이라는걸 들어보셨을거에요.그걸 왜 쓰는지 궁금하실겁니다.&lt;br /&gt;
* 일단 '배열'이라는건 같은 데이터 타입을 가지는 변수의 '집단'이라고 할 수 있습니다.&lt;br /&gt;
* 예를 들어 10개의 과목에 대한 점수를 기억하려면 다음과 같이 10개의 정수형 변수가 필요할 것입니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int score1;&lt;br /&gt;
int score2;&lt;br /&gt;
int score3;&lt;br /&gt;
int score4;&lt;br /&gt;
int score5;&lt;br /&gt;
int score6;&lt;br /&gt;
int score7;&lt;br /&gt;
int score8;&lt;br /&gt;
int score9;&lt;br /&gt;
int score10;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 보세요. 보기만 해도 선언도 귀찮고 기억하기도 힘들겠죠?&lt;br /&gt;
* 근데, 이걸 100명분을 작성한다고 칩시다.&lt;br /&gt;
* 이럴땐 다음과 같이 배열로 하면 좀더 쉽게 작성할 수 있습니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
타입 변수명[갯수];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 예제를 하나 보죠.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int score[100];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 이런식으로 사용합니다. 다음은 1부터 10까지 돌면서 해당 값에 2를 곱해서 저장하는 프로그램입니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int score[10];&lt;br /&gt;
for(int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
{&lt;br /&gt;
  score[i] = i * 2;&lt;br /&gt;
  qDebug() &amp;lt;&amp;lt; &amp;quot;i = &amp;quot; &amp;lt;&amp;lt; score[i];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 실행 결과는 다음과 같을 것입니다.&lt;br /&gt;
[[파일:Qt_2_script_0.png]]&lt;br /&gt;
* 이걸 보고 이상하다는 생각이 들지 않나요?&lt;br /&gt;
* 컴퓨터한테는 첫번째 숫자가 1이 아니라 0입니다.&lt;br /&gt;
* 이걸 1부터 시작해서 10으로 끝나게 만들려면 어떻게 해야 할까요? 한번 고민해보고 만들어보시기 바랍니다. :)&lt;br /&gt;
&lt;br /&gt;
=== 동적 배열 ===&lt;br /&gt;
* 그런데 배열의ㅈㅈ습니다. (이거 뭐라고 하는지 모르겠으니 수정해주시면 감사하겠습니다.)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int* 변수이름 = new 타입[갯수];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 타입 뒤에 *가 들어갑니다. 중요합니다.&lt;br /&gt;
* 또한, 할당하고 나서 다음과 같이 꼭 해제를 해줘야 합니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
delete[] 변수이름;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 요즘 인기있는 언어들이 Garbage Collector를 포함하며, 인터프리터를 지향하고 있는 이유는 해제할 타이밍이 애매한 경우가 많아서입니다.&lt;br /&gt;
* 하지만, 조금 크게 메모리를 할당하거나 하는 방법으로 메모리 해제 타이밍을 잡을 수 있습니다.&lt;br /&gt;
* 또한 QT에서는 QT 데이터타입을 사용하면 내부적으로 Garbage Collector를 적용한다고 합니다.&lt;br /&gt;
* 아무튼 예제를 하나 보도록 하겠습니다. 마찬가지로 위와 같은 프로그램입니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int* score = new int[10];&lt;br /&gt;
for(int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
{&lt;br /&gt;
  score[i] = i * 2;&lt;br /&gt;
  qDebug() &amp;lt;&amp;lt; &amp;quot;i = &amp;quot; &amp;lt;&amp;lt; score[i];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 다차원배열 ===&lt;br /&gt;
* 지금까지 본건 1차원 배열입니다.&lt;br /&gt;
* QT를 컴파일하는 gcc의 경우 10차원이 넘는 배열을 선언할 수 있습니다.&lt;br /&gt;
* 간단한 프로그램을 작성해 봅시다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int data[3][5];&lt;br /&gt;
for(int i = 0; i &amp;lt; 3; i++)&lt;br /&gt;
{&lt;br /&gt;
  for(int j = 0; j &amp;lt; 5; j++)&lt;br /&gt;
  {&lt;br /&gt;
    data[i][j] = i * j;&lt;br /&gt;
    qDebug() &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &amp;quot;*&amp;quot; &amp;lt;&amp;lt; &amp;quot;j&amp;quot; &amp;lt;&amp;lt; &amp;quot;=&amp;quot; &amp;lt;&amp;lt; data[i][j];&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 대충 무슨 프로그램인지 보이시지요?&lt;br /&gt;
* 자 이걸 구구단으로 바꿔보세요.&lt;br /&gt;
=== 구조체 ===&lt;br /&gt;
* 구조체는 다음과 같이 사용합니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct {&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== 함수 ===&lt;br /&gt;
&lt;br /&gt;
== GUI 기초 및 응용 ==&lt;br /&gt;
=== 컨트롤 ===&lt;br /&gt;
[[파일:Layouts.png]][[파일:Spacers.png]][[파일:Buttons.png]][[파일:Item Views.png]][[파일:Item Widget.png]][[파일:Containers.png]][[파일:Input Widget.png]][[파일:Display Widget.png]]&lt;br /&gt;
=== 프로그램을 작성하는 순서 ===&lt;br /&gt;
* 일반적으로 프로그램은 다음과 같은 순서로 작성합니다.&lt;br /&gt;
# GUI 구상 - 어떤 GUI를 만들 것인지 구상합니다.&lt;br /&gt;
# 객체 배치 - 컨트롤을 사용하여 객체들을 폼 위에 배치합니다.&lt;br /&gt;
# 속성 조절 - 속성창에서 조절할 필요가 있는 속성들을 지정합니다.&lt;br /&gt;
# 슬롯 선택 - 객체별로 필요한 슬롯을 선택하고 코딩을 합니다. 이때 프로그램에서 제어할 필요가 있는 속성은 객체-&amp;gt;속성으로 지정하고, 객체-&amp;gt;메소드나 함수, 명령문을 사용하여 객체의 이벤트를 완성합니다.&lt;br /&gt;
# 디버깅 - 실행을 하고 에러가 있으면 수정을 해서 다시 실행합니다.&lt;br /&gt;
* 물론 이것이 정석적인 방법이라고 볼 수는 없겠습니다만, 일반적인 취향이라고 볼 수 있겠습니다.&lt;br /&gt;
=== 컨트롤을 쉽게 배치하는 방법 ===&lt;br /&gt;
* 폼 위에 객체를 그리다 보면 동일한 객체를 여러개 그려야 하는 경우가 많습니다. 이들의 크기나 위치등을 하나씩 배치할수도 있겠으나, 우리는 도구를 쓰도록 합시다.&lt;br /&gt;
&lt;br /&gt;
[[파일:Qt 2 gui 0.png]]&lt;br /&gt;
[[파일:Qt 2 gui 1.png]]&lt;br /&gt;
[[파일:Qt 2 gui 2.png]]&lt;br /&gt;
p;;;;;&lt;br /&gt;
&lt;br /&gt;
=== QPushButton 컨트롤 사용하기 ===&lt;br /&gt;
* 버튼입니다. 프로그램 만들면 많이들 사용하는 컨트롤이죠.&lt;br /&gt;
* 이 버튼은 대개 누르면 작업이 실행되게 하는 용도로 사용되죠.&lt;br /&gt;
* Enabled라는 속성에 대해 좀 중점적으로 보시면 좋을듯 합니다.&lt;br /&gt;
* 다음과 같은 프로그램을 만들어봅시다.&lt;br /&gt;
[[file:First Qt App.png]]&lt;br /&gt;
* QPushButton 3개와 QLabel 1개를 배치해 봅시다.&lt;br /&gt;
* 그리고 QPushButton에 Clicked 슬롯을 만들고 다음과 같이 작성해 줍니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Dialog::on_pushButton_clicked()&lt;br /&gt;
{&lt;br /&gt;
    ui-&amp;gt;label-&amp;gt;setText(&amp;quot;하드웨어 지원 최강&amp;quot;);&lt;br /&gt;
    ui-&amp;gt;pushButton-&amp;gt;setEnabled(false);&lt;br /&gt;
    ui-&amp;gt;pushButton_2-&amp;gt;setEnabled(true);&lt;br /&gt;
    ui-&amp;gt;pushButton_3-&amp;gt;setEnabled(true);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Dialog::on_pushButton_2_clicked()&lt;br /&gt;
{&lt;br /&gt;
    ui-&amp;gt;label-&amp;gt;setText(&amp;quot;유저가 최강&amp;quot;);&lt;br /&gt;
    ui-&amp;gt;pushButton-&amp;gt;setEnabled(true);&lt;br /&gt;
    ui-&amp;gt;pushButton_2-&amp;gt;setEnabled(false);&lt;br /&gt;
    ui-&amp;gt;pushButton_3-&amp;gt;setEnabled(true);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Dialog::on_pushButton_3_clicked()&lt;br /&gt;
{&lt;br /&gt;
    ui-&amp;gt;label-&amp;gt;setText(&amp;quot;스타벅스 가냐?&amp;quot;);&lt;br /&gt;
    ui-&amp;gt;pushButton-&amp;gt;setEnabled(true);&lt;br /&gt;
    ui-&amp;gt;pushButton_2-&amp;gt;setEnabled(true);&lt;br /&gt;
    ui-&amp;gt;pushButton_3-&amp;gt;setEnabled(false);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 유의할 점은 void Dialog::on_pushButton_clicked() &amp;lt;- 이 부분은 직접 코딩하는게 &amp;lt;b&amp;gt;아닙니다!!&amp;lt;/b&amp;gt;&lt;br /&gt;
* 슬롯을 전부 만드시고 위와 같이 코드를 작성하셨다면 누른 버튼이 비활성화되는게 보이실겁니다.&lt;br /&gt;
&lt;br /&gt;
=== QLineEdit 컨트롤 사용하기 ===&lt;br /&gt;
* 주로 주관식 데이터를 입력하기 위해 많이 사용하는 LineEdit 컨트롤을 지정해 봅시다.&lt;br /&gt;
* 성적을 계산하는 프로그램인데, 텍스트상자를 이용해서 이름과 점수를 입력합니다.&lt;br /&gt;
* 다음과 같은 프로그램을 만들 것입니다.&lt;br /&gt;
[[파일:Qt_App_2.png]]&lt;br /&gt;
* Grid Layout을 이용하면 의외로 간단하게 화면 구성이 가능합니다.&lt;br /&gt;
* 다음과 같이 그리드 레이아웃을 만들고 왼쪽에는 Label을, 오른쪽에는 LineEdit를 드래그해서 집어넣습니다.&lt;br /&gt;
[[파일:Qt_2_drag_drop_0.png]]&lt;br /&gt;
[[파일:Qt_2_drag_drop_1.png]]&lt;br /&gt;
[[파일:Qt_2_drag_drop_2.png]]&lt;br /&gt;
* 그리고 버튼도 Horizontal Layout을 이용하면 쉽게 배열이 가능합니다.&lt;br /&gt;
* 레이블과 버튼, 라인에디트를 배열하고 각각 속성에서 제목을 적어줍니다.&lt;br /&gt;
* 헤더파일에 QDebug를 include하고, 다음과 같이 변수를 선언해 줍니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
QString name;&lt;br /&gt;
int kor;&lt;br /&gt;
int eng;&lt;br /&gt;
int math;&lt;br /&gt;
&lt;br /&gt;
int total;&lt;br /&gt;
int avg;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 각 버튼의 코드는 다음과 같습니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Widget::on_pushButton_clicked()&lt;br /&gt;
{&lt;br /&gt;
    name = ui-&amp;gt;lineEdit-&amp;gt;text();&lt;br /&gt;
    kor = ui-&amp;gt;lineEdit_2-&amp;gt;text().toInt();&lt;br /&gt;
    eng = ui-&amp;gt;lineEdit_3-&amp;gt;text().toInt();&lt;br /&gt;
    math = ui-&amp;gt;lineEdit_4-&amp;gt;text().toInt();&lt;br /&gt;
    total = kor + eng + math;&lt;br /&gt;
    avg = total /3;&lt;br /&gt;
    qDebug() &amp;lt;&amp;lt; &amp;quot;이름      국어 영어 수학 총점 평균&amp;quot;;&lt;br /&gt;
    qDebug() &amp;lt;&amp;lt; name &amp;lt;&amp;lt; &amp;quot; &amp;quot; &amp;lt;&amp;lt; kor &amp;lt;&amp;lt; &amp;quot; &amp;quot; &amp;lt;&amp;lt; eng &amp;lt;&amp;lt; &amp;quot; &amp;quot; &amp;lt;&amp;lt; math &amp;lt;&amp;lt; &amp;quot; &amp;quot; &amp;lt;&amp;lt; total &amp;lt;&amp;lt; &amp;quot; &amp;quot; &amp;lt;&amp;lt; avg;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Widget::on_pushButton_2_clicked()&lt;br /&gt;
{&lt;br /&gt;
    this-&amp;gt;close();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 실제 입력에 따라 다음과 같이 결과가 출력되는걸 볼 수 있습니다.&lt;br /&gt;
결과 나오는 화면&lt;br /&gt;
[[파일:Qt_App_2_Result.png]]&lt;br /&gt;
&lt;br /&gt;
=== QCheckBox 컨트롤 사용하기 ===&lt;br /&gt;
* 체크박스는 체크 표시된 항목을 선택하는 기능을 제공합니다.&lt;br /&gt;
* 아마도 웹사이트에서 많이 보셨을겁니다.&lt;br /&gt;
* 이것의 특징은, 라디오버튼과 달리 여러개의 항목을 동시에 선택할 수 있다는 겁니다.&lt;br /&gt;
* 남자가 결혼하기 전에 사야 할 물품을 정리해 보았습니다.&lt;br /&gt;
* 폼에 판매 품목과 가격을 체크상자로 표시하고, 소비자가 상자를 선택하고 총액계산 버튼을 누르면 텍스트 상자에 총액이 표시되도록 하는것이 목표입니다.&lt;br /&gt;
실행 화면&lt;br /&gt;
&lt;br /&gt;
[[파일:checkbox_result.png]]&lt;br /&gt;
&lt;br /&gt;
* 헤더에 변수를 하나 선언합니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int sum;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 위 폼은 쉽게 만들 수 있을것이라 생각하고, 각 버튼의 코드는 다음과 같습니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Widget::on_pushButton_clicked()&lt;br /&gt;
{&lt;br /&gt;
    sum = 0;&lt;br /&gt;
    if(ui-&amp;gt;checkBox-&amp;gt;isChecked())&lt;br /&gt;
        sum += 650000;&lt;br /&gt;
    if(ui-&amp;gt;checkBox_2-&amp;gt;isChecked())&lt;br /&gt;
        sum += 550000;&lt;br /&gt;
    if(ui-&amp;gt;checkBox_3-&amp;gt;isChecked())&lt;br /&gt;
        sum += 150000;&lt;br /&gt;
    if(ui-&amp;gt;checkBox_4-&amp;gt;isChecked())&lt;br /&gt;
        sum += 250000;&lt;br /&gt;
    ui-&amp;gt;lineEdit-&amp;gt;setText(QString::number(sum));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Widget::on_pushButton_2_clicked()&lt;br /&gt;
{&lt;br /&gt;
    ui-&amp;gt;checkBox-&amp;gt;setChecked(false);&lt;br /&gt;
    ui-&amp;gt;checkBox_2-&amp;gt;setChecked(false);&lt;br /&gt;
    ui-&amp;gt;checkBox_3-&amp;gt;setChecked(false);&lt;br /&gt;
    ui-&amp;gt;checkBox_4-&amp;gt;setChecked(false);&lt;br /&gt;
    ui-&amp;gt;lineEdit-&amp;gt;setText(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 체크버튼을 누르면 바로 적용되도록 만들 수 있을 것입니다.&lt;br /&gt;
* 이건 직접 해보시는게 어떨까요?&lt;br /&gt;
&lt;br /&gt;
=== QRadioButton 컨트롤 사용하기 ===&lt;br /&gt;
* 라디오버튼은 옵션 버튼이라고도 합니다.&lt;br /&gt;
* 체크 상자와 비슷하게 항목을 선택할 때 사용되지만, 옵션 버튼은 여러개 중에서 한개만 선택할 수 있는데에 많이 사용됩니다.&lt;br /&gt;
* 체크버튼가지고도 코드 부분을 좀 수정하면 라디오버튼과 같은 동작을 하게 만들수 있습니다.&lt;br /&gt;
* 특정 버튼을 선택했다가 다른 버튼을 선택하면 이전에 선택했던 버튼의 체크표시는 지워집니다.&lt;br /&gt;
* 아래 프로그램을 한번 만들어 보도록 하겠습니다. 라디오버튼과 체크버튼을 같이 쓰니까 비교하기가 쉬울겁니다.&lt;br /&gt;
[[파일:Qt_3_result_0.png]]&lt;br /&gt;
* 자신의 연령대를 선택하고 연애인을 선택한 후 결과보기 버튼을 누르면 텍스트 상자에 결과가 표시됩니다.&lt;br /&gt;
* 다시보기 버튼을 누르면 내용이 싹 지워져서 새로 선택하기 편하도록 편의성을 높였습니다.&lt;br /&gt;
* 헤더에 추가할 코드는 다음과 같습니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
QString age;&lt;br /&gt;
QString singer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 소스코드에 추가할 내용입니다. PushButton에 슬롯으로 작성하는건 이제 다들 익숙해지셨으리라 생각합니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Widget::on_pushButton_clicked()&lt;br /&gt;
{&lt;br /&gt;
    singer = &amp;quot;&amp;quot;;&lt;br /&gt;
    if(ui-&amp;gt;radioButton-&amp;gt;isChecked())&lt;br /&gt;
        age = &amp;quot;10대&amp;quot;;&lt;br /&gt;
    if(ui-&amp;gt;radioButton_2-&amp;gt;isChecked())&lt;br /&gt;
        age = &amp;quot;20대&amp;quot;;&lt;br /&gt;
    if(ui-&amp;gt;radioButton_3-&amp;gt;isChecked())&lt;br /&gt;
        age = &amp;quot;30대&amp;quot;;&lt;br /&gt;
    if(ui-&amp;gt;radioButton_4-&amp;gt;isChecked())&lt;br /&gt;
        age = &amp;quot;40대&amp;quot;;&lt;br /&gt;
    if(ui-&amp;gt;radioButton_5-&amp;gt;isChecked())&lt;br /&gt;
        age = &amp;quot;외계인&amp;quot;;&lt;br /&gt;
    if(ui-&amp;gt;checkBox-&amp;gt;isChecked())&lt;br /&gt;
        singer += &amp;quot;소녀시대 &amp;quot;;&lt;br /&gt;
    if(ui-&amp;gt;checkBox_2-&amp;gt;isChecked())&lt;br /&gt;
        singer += &amp;quot;2ne1 &amp;quot;;&lt;br /&gt;
    if(ui-&amp;gt;checkBox_3-&amp;gt;isChecked())&lt;br /&gt;
        singer += &amp;quot;이선희 &amp;quot;;&lt;br /&gt;
    if(ui-&amp;gt;checkBox_4-&amp;gt;isChecked())&lt;br /&gt;
        singer += &amp;quot;걸스데이 &amp;quot;;&lt;br /&gt;
    if(ui-&amp;gt;checkBox_5-&amp;gt;isChecked())&lt;br /&gt;
        singer += &amp;quot;EXO &amp;quot;;&lt;br /&gt;
    ui-&amp;gt;lineEdit-&amp;gt;setText(age + &amp;quot;인 당신은 &amp;quot; + singer +&amp;quot;를 좋아하네요.&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Widget::on_pushButton_2_clicked()&lt;br /&gt;
{&lt;br /&gt;
    ui-&amp;gt;radioButton-&amp;gt;setChecked(false);&lt;br /&gt;
    ui-&amp;gt;radioButton_2-&amp;gt;setChecked(false);&lt;br /&gt;
    ui-&amp;gt;radioButton_3-&amp;gt;setChecked(false);&lt;br /&gt;
    ui-&amp;gt;radioButton_4-&amp;gt;setChecked(false);&lt;br /&gt;
    ui-&amp;gt;radioButton_5-&amp;gt;setChecked(false);&lt;br /&gt;
    ui-&amp;gt;checkBox-&amp;gt;setChecked(false);&lt;br /&gt;
    ui-&amp;gt;checkBox_2-&amp;gt;setChecked(false);&lt;br /&gt;
    ui-&amp;gt;checkBox_3-&amp;gt;setChecked(false);&lt;br /&gt;
    ui-&amp;gt;checkBox_4-&amp;gt;setChecked(false);&lt;br /&gt;
    ui-&amp;gt;checkBox_5-&amp;gt;setChecked(false);&lt;br /&gt;
    ui-&amp;gt;lineEdit-&amp;gt;setText(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== QGroupBox ===&lt;br /&gt;
* 그룹박스는 다른 객체들을 묶는 역할을 합니다.&lt;br /&gt;
* 다른 여러 프로그램상에서 많이들 보셨을겁니다.&lt;br /&gt;
* 이건 말보다 프로그램을 직접 보시는게 나을듯.&lt;br /&gt;
실행화면&lt;br /&gt;
&lt;br /&gt;
[[파일:QGroupBox_1.png]]&lt;br /&gt;
&lt;br /&gt;
[[파일:QGroupBox_2.png]]&lt;br /&gt;
&lt;br /&gt;
* 보시면 2개의 그룹박스를 사용하고 있습니다.&lt;br /&gt;
* PC 보유현황과 주변장치현황이 프레임입니다.&lt;br /&gt;
* 나머지 내용은 위의 QRadiobutton강좌와 같다고 보시면 됩니다.&lt;br /&gt;
* 헤더에는 변수를 선언해 줍니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
QString com;&lt;br /&gt;
QString phr;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 다음은 버튼에 관한 코드입니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Widget::on_pushButton_clicked()&lt;br /&gt;
{&lt;br /&gt;
    phr = &amp;quot;&amp;quot;;&lt;br /&gt;
    if(ui-&amp;gt;radioButton-&amp;gt;isChecked())&lt;br /&gt;
        com = ui-&amp;gt;radioButton-&amp;gt;text();&lt;br /&gt;
    if(ui-&amp;gt;radioButton_2-&amp;gt;isChecked())&lt;br /&gt;
        com = ui-&amp;gt;radioButton_2-&amp;gt;text();&lt;br /&gt;
    if(ui-&amp;gt;radioButton_3-&amp;gt;isChecked())&lt;br /&gt;
        com = ui-&amp;gt;radioButton_3-&amp;gt;text();&lt;br /&gt;
    if(ui-&amp;gt;radioButton_4-&amp;gt;isChecked())&lt;br /&gt;
        com = ui-&amp;gt;radioButton_4-&amp;gt;text();&lt;br /&gt;
    if(ui-&amp;gt;checkBox-&amp;gt;isChecked())&lt;br /&gt;
        phr += ui-&amp;gt;checkBox-&amp;gt;text();&lt;br /&gt;
    if(ui-&amp;gt;checkBox_2-&amp;gt;isChecked())&lt;br /&gt;
        phr += ui-&amp;gt;checkBox_2-&amp;gt;text();&lt;br /&gt;
    if(ui-&amp;gt;checkBox_3-&amp;gt;isChecked())&lt;br /&gt;
        phr += ui-&amp;gt;checkBox_3-&amp;gt;text();&lt;br /&gt;
    if(ui-&amp;gt;checkBox_4-&amp;gt;isChecked())&lt;br /&gt;
        phr += ui-&amp;gt;checkBox_4-&amp;gt;text();&lt;br /&gt;
    ui-&amp;gt;lineEdit-&amp;gt;setText(&amp;quot;당신은 &amp;quot; + com + &amp;quot;컴퓨터와 &amp;quot; + phr + &amp;quot;주변장치를 보유중입니다.&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== QListWidget ===&lt;br /&gt;
* ListWidget 컨트롤은 상자 안에 항목들을 나열하는 기능을 제공합니다.&lt;br /&gt;
* 이거랑 ComboBoxWidget이 목록을 제공하는 대표적인 컨트롤입니다.&lt;br /&gt;
* ListWidget은 여러개의 항목 선택을 할 수 있도록 되어 있으며, Shift나 Ctrl등을 이용해서 선택할 수 있도록 되어 있습니다.&lt;br /&gt;
[[파일:listwidget_result.png]]&lt;br /&gt;
&lt;br /&gt;
* 코드는 매우 간단합니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Widget::on_pushButton_clicked()&lt;br /&gt;
{&lt;br /&gt;
    ui-&amp;gt;listWidget-&amp;gt;addItem(ui-&amp;gt;lineEdit-&amp;gt;text());&lt;br /&gt;
    ui-&amp;gt;lineEdit-&amp;gt;setText(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== QComboBox ===&lt;br /&gt;
* 콤보박스 컨트롤은 펼침 목록 기능을 제공합니다.&lt;br /&gt;
* 웹사이트를 방문해보면 주소 입력하는데 대부분 이거 씁니다.&lt;br /&gt;
* 프로그래밍에서도 종종 씁니다.&lt;br /&gt;
* ListWidget과 사용법은 비슷합니다.&lt;br /&gt;
결과화면&lt;br /&gt;
&lt;br /&gt;
[[파일:combobox_result.png]]&lt;br /&gt;
&lt;br /&gt;
* 이번에는 버튼을 만들지 않고, 콤보박스의 내용이 변경되는 즉시 반영되도록 해봅시다.&lt;br /&gt;
* 슬롯 선택시 다음과 같이 선택하세요.&lt;br /&gt;
[[파일:combobox_slot.png]]&lt;br /&gt;
* 코드는 다음과 같습니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Widget::on_comboBox_currentIndexChanged(int index)&lt;br /&gt;
{&lt;br /&gt;
    if(index == 0)&lt;br /&gt;
    {&lt;br /&gt;
        ui-&amp;gt;comboBox_2-&amp;gt;clear();&lt;br /&gt;
        ui-&amp;gt;comboBox_2-&amp;gt;addItem(&amp;quot;연남동&amp;quot;);&lt;br /&gt;
        ui-&amp;gt;comboBox_2-&amp;gt;addItem(&amp;quot;서교동&amp;quot;);&lt;br /&gt;
        ui-&amp;gt;comboBox_2-&amp;gt;addItem(&amp;quot;동교동&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    if(index == 1)&lt;br /&gt;
    {&lt;br /&gt;
        ui-&amp;gt;comboBox_2-&amp;gt;clear();&lt;br /&gt;
        ui-&amp;gt;comboBox_2-&amp;gt;addItem(&amp;quot;삼청동&amp;quot;);&lt;br /&gt;
        ui-&amp;gt;comboBox_2-&amp;gt;addItem(&amp;quot;사직동&amp;quot;);&lt;br /&gt;
        ui-&amp;gt;comboBox_2-&amp;gt;addItem(&amp;quot;계동&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    if(index == 2)&lt;br /&gt;
    {&lt;br /&gt;
        ui-&amp;gt;comboBox_2-&amp;gt;clear();&lt;br /&gt;
        ui-&amp;gt;comboBox_2-&amp;gt;addItem(&amp;quot;신사동&amp;quot;);&lt;br /&gt;
        ui-&amp;gt;comboBox_2-&amp;gt;addItem(&amp;quot;논현동&amp;quot;);&lt;br /&gt;
        ui-&amp;gt;comboBox_2-&amp;gt;addItem(&amp;quot;도곡동&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Widget::on_comboBox_2_currentIndexChanged(int index)&lt;br /&gt;
{&lt;br /&gt;
    ui-&amp;gt;lineEdit-&amp;gt;setText(&amp;quot;선택된 주소는 &amp;quot; + ui-&amp;gt;comboBox-&amp;gt;currentText() + &amp;quot; &amp;quot; + ui-&amp;gt;comboBox_2-&amp;gt;currentText() + &amp;quot;입니다.&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Slider &amp;amp; Dial ===&lt;br /&gt;
* 슬라이더를 봅시다.&lt;br /&gt;
* 각각의 슬라이더의 값 변화에 따라 레이블도 변화하도록 해봅시다.&lt;br /&gt;
* Dial은 꼭 옛날 전축에 있던거랑 비슷하게 생겼지요?&lt;br /&gt;
결과화면&lt;br /&gt;
&lt;br /&gt;
[[파일:sliders_result.png]]&lt;br /&gt;
&lt;br /&gt;
* 슬롯 하나하나마다 다음과 같이 슬롯을 작성하고&lt;br /&gt;
슬롯 선택&lt;br /&gt;
* 코드는 다음과 같이 작성하면 된다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Widget::on_horizontalScrollBar_valueChanged(int value)&lt;br /&gt;
{&lt;br /&gt;
    ui-&amp;gt;label-&amp;gt;setText(QString(&amp;quot;%1&amp;quot;).arg(value));&lt;br /&gt;
    ui-&amp;gt;dial-&amp;gt;setValue(value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Widget::on_horizontalSlider_valueChanged(int value)&lt;br /&gt;
{&lt;br /&gt;
    ui-&amp;gt;label_2-&amp;gt;setText(QString(&amp;quot;%1&amp;quot;).arg(value));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Widget::on_verticalScrollBar_valueChanged(int value)&lt;br /&gt;
{&lt;br /&gt;
    ui-&amp;gt;label_3-&amp;gt;setText(QString(&amp;quot;%1&amp;quot;).arg(value));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Widget::on_verticalSlider_valueChanged(int value)&lt;br /&gt;
{&lt;br /&gt;
    ui-&amp;gt;label_4-&amp;gt;setText(QString(&amp;quot;%1&amp;quot;).arg(value));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== QTimer ===&lt;br /&gt;
* 타이머는 시간과 관련된 컨트롤입니다.&lt;br /&gt;
* 다음과 같이 시계를 만들어 보도록 하겠습니다.&lt;br /&gt;
실행화면&lt;br /&gt;
&lt;br /&gt;
[[파일:clock_result.png]]&lt;br /&gt;
&lt;br /&gt;
* 시계는 코드에 직접 작성해 주어야 합니다.&lt;br /&gt;
* 헤더파일에 QTimer와 QDateTime을 include해줍니다.&lt;br /&gt;
* QTimer는 타이머고, QDateTime은 현재시각을 받아오기 위해 사용합니다.&lt;br /&gt;
* private:에 timer를 하나 선언하고, private slots:에 tupdate() 함수를 등록해 줍니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
private:&lt;br /&gt;
    QTimer* timer;&lt;br /&gt;
&lt;br /&gt;
private slots:&lt;br /&gt;
    int tupdate();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 프로그램이 실행되면서 타이머가 동작하도록 아래의 코드를 메인 위젯 안에 넣어줍니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
timer = new QTimer(this); // 타이머 생성&lt;br /&gt;
connect(timer, SIGNAL(timeout()), this, SLOT(tupdate())); // 타이머가 타임아웃이 되면 tupdate()를 호출&lt;br /&gt;
timer-&amp;gt;start(1000); // 1000은 밀리세컨드 단위. 타임아웃을 몇 ms로 할것인지 정함. 여기서는 1초마다 한번씩.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 그리고, tupdate() 함수를 다음과 같이 작성합니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int Widget::tupdate()&lt;br /&gt;
{&lt;br /&gt;
    QDateTime local(QDateTime::currentDateTime());&lt;br /&gt;
    ui-&amp;gt;label_3-&amp;gt;setText(local.toString());&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== QFileDialog ===&lt;br /&gt;
* 파일 컨트롤은 파일을 선택하거나, 파일을 저장할 때에 많이 사용되는 컨트롤입니다.&lt;br /&gt;
* 이건 기본 컨트롤엔 없으나, 사용 빈도가 굉장히 높습니다.&lt;br /&gt;
실행화면&lt;br /&gt;
&lt;br /&gt;
[[파일:file_result.png]]&lt;br /&gt;
&lt;br /&gt;
* 파일 다이얼로그를 사용하기 위해서는 QFileDialog를 include해야 합니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;QFileDialog&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 그리고 버튼에 대한 코드는 다음과 같습니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Widget::on_pushButton_clicked()&lt;br /&gt;
{&lt;br /&gt;
    QString file = QFileDialog::getOpenFileName();&lt;br /&gt;
    ui-&amp;gt;lineEdit-&amp;gt;setText(file);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Widget::on_pushButton_2_clicked()&lt;br /&gt;
{&lt;br /&gt;
    this-&amp;gt;close();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 파일 컨트롤도 참 쉽죠?&lt;br /&gt;
* 속성도 지정할 수 있습니다. png 파일만 연다든지.. 이 부분은 직접 해보세요 :)&lt;br /&gt;
=== QGraphicsView ===&lt;br /&gt;
* GraphicsView는 각종 도형, 텍스트 등을 좀 더 유연하게 사용할 수 있도록 만들어진 Canvas같은 개념의 컨트롤입니다.&lt;br /&gt;
* 단독으로는 아무것도 할 수 없고, GraphicsScene과 함께 동작합니다.&lt;br /&gt;
* 그림파일을 하나 불러와 보여주는 프로그램을 작성해 보겠습니다.&lt;br /&gt;
[[파일:Qt graphic result.png]]&lt;br /&gt;
* 헤더파일의 수정은 다음과 같습니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// 헤더를 include해줍니다.&lt;br /&gt;
#include &amp;lt;QGraphicsScene&amp;gt;&lt;br /&gt;
#include &amp;lt;QPixmap&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// private 선언부에 scene 변수를 선언해 둡니다.&lt;br /&gt;
QGraphicsScene scene;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 소스코드입니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Widget 안 setupUi 이후에 다음과 같은 코드를 삽입합니다.&lt;br /&gt;
    QPixmap pix(&amp;quot;hello.png&amp;quot;);&lt;br /&gt;
    scene.addPixmap(pix);&lt;br /&gt;
    ui-&amp;gt;graphicsView-&amp;gt;setScene(&amp;amp;scene);&lt;br /&gt;
    ui-&amp;gt;graphicsView-&amp;gt;show();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 실행파일과 같은 디렉토리에 hello.png (png 파일 아무거나 넣어보세요)가 있다면 그 그림파일이 출력될 것입니다.&lt;br /&gt;
* 과제 : 전에 배운 FileOpenDialog를 이용해서, 파일을 선택해 보여줄 수 있도록 만들어 봅시다.&lt;br /&gt;
=== QTabWidget ===&lt;br /&gt;
* 탭 컨트롤에 대해 알아보겠습니다.&lt;br /&gt;
* 보통, 설정같이 내용은 많고, 각각의 성격에 따라 분류하고 싶을 경우 많이들 사용합니다.&lt;br /&gt;
* 코드로 작성하기보다는 일반적으로 디자인에서 다 하는 경우가 많습니다.&lt;br /&gt;
[[파일:Settings-ss00.png]]&lt;br /&gt;
=== QProgressBar ===&lt;br /&gt;
* 프로그레스바에 대해 알아보도록 하겠습니다.&lt;br /&gt;
* 가짜로 만든 로딩바 입니다.&lt;br /&gt;
[[파일:Progressbar-ss00.png]]&lt;br /&gt;
* 헤더는 다음과 같습니다&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// QTimer를 include해줍니다&lt;br /&gt;
#include &amp;lt;QTimer&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// 함수 정의에 다음과 같이 해줍니다.&lt;br /&gt;
private:&lt;br /&gt;
    Ui::Widget *ui;&lt;br /&gt;
    QTimer* timer;&lt;br /&gt;
    int tick;&lt;br /&gt;
&lt;br /&gt;
private slots:&lt;br /&gt;
    int tupdate();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 소스코드는 다음과 같습니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// setupUi 다음에 넣어줍니다.&lt;br /&gt;
    timer = new QTimer(this);&lt;br /&gt;
    connect(timer, SIGNAL(timeout()), this, SLOT(tupdate()));&lt;br /&gt;
    tick = 0;&lt;br /&gt;
    timer-&amp;gt;start(10);&lt;br /&gt;
&lt;br /&gt;
// tupdate 함수는 다음과 같습니다.&lt;br /&gt;
int Widget::tupdate()&lt;br /&gt;
{&lt;br /&gt;
    if(tick == 100) ui-&amp;gt;label-&amp;gt;setText(&amp;quot;Loading Complete&amp;quot;);&lt;br /&gt;
    if(tick &amp;lt; 100) tick++;&lt;br /&gt;
    ui-&amp;gt;progressBar-&amp;gt;setValue(tick);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 계산기 ===&lt;br /&gt;
* Youtube : https://www.youtube.com/watch?v=3FT3c7mFQFI&lt;br /&gt;
* 흔히 집에 하나씩 있는 천원짜리 계산기를 한번 만들어 보도록 하겠습니다.&lt;br /&gt;
[[파일:calculator_result.png]]&lt;br /&gt;
*새로운 개념이 추가된 것은 없습니다. 기존에 배운 개념을 활용하여 만들 수 있습니다.&lt;br /&gt;
*소스코드는 아래와 같습니다.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Widget::on_pushButton_1_clicked()&lt;br /&gt;
{&lt;br /&gt;
    if (QString::compare (ui-&amp;gt;lineEdit_2-&amp;gt;text(), &amp;quot;&amp;quot;) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        ui-&amp;gt;lineEdit-&amp;gt;setText(ui-&amp;gt;lineEdit-&amp;gt;text() + &amp;quot;1&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        ui-&amp;gt;lineEdit_3-&amp;gt;setText(ui-&amp;gt;lineEdit_3-&amp;gt;text() + &amp;quot;1&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Widget::on_pushButton_2_clicked()&lt;br /&gt;
{&lt;br /&gt;
    if (QString::compare (ui-&amp;gt;lineEdit_2-&amp;gt;text(), &amp;quot;&amp;quot;) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        ui-&amp;gt;lineEdit-&amp;gt;setText(ui-&amp;gt;lineEdit-&amp;gt;text() + &amp;quot;2&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        ui-&amp;gt;lineEdit_3-&amp;gt;setText(ui-&amp;gt;lineEdit_3-&amp;gt;text() + &amp;quot;2&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Widget::on_pushButton_3_clicked()&lt;br /&gt;
{&lt;br /&gt;
    if (QString::compare (ui-&amp;gt;lineEdit_2-&amp;gt;text(), &amp;quot;&amp;quot;) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        ui-&amp;gt;lineEdit-&amp;gt;setText(ui-&amp;gt;lineEdit-&amp;gt;text() + &amp;quot;3&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        ui-&amp;gt;lineEdit_3-&amp;gt;setText(ui-&amp;gt;lineEdit_3-&amp;gt;text() + &amp;quot;3&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Widget::on_pushButton_4_clicked()&lt;br /&gt;
{&lt;br /&gt;
    if (QString::compare (ui-&amp;gt;lineEdit_2-&amp;gt;text(), &amp;quot;&amp;quot;) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        ui-&amp;gt;lineEdit-&amp;gt;setText(ui-&amp;gt;lineEdit-&amp;gt;text() + &amp;quot;4&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        ui-&amp;gt;lineEdit_3-&amp;gt;setText(ui-&amp;gt;lineEdit_3-&amp;gt;text() + &amp;quot;4&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Widget::on_pushButton_5_clicked()&lt;br /&gt;
{&lt;br /&gt;
    if (QString::compare (ui-&amp;gt;lineEdit_2-&amp;gt;text(), &amp;quot;&amp;quot;) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        ui-&amp;gt;lineEdit-&amp;gt;setText(ui-&amp;gt;lineEdit-&amp;gt;text() + &amp;quot;5&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        ui-&amp;gt;lineEdit_3-&amp;gt;setText(ui-&amp;gt;lineEdit_3-&amp;gt;text() + &amp;quot;5&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Widget::on_pushButton_6_clicked()&lt;br /&gt;
{&lt;br /&gt;
    if (QString::compare (ui-&amp;gt;lineEdit_2-&amp;gt;text(), &amp;quot;&amp;quot;) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        ui-&amp;gt;lineEdit-&amp;gt;setText(ui-&amp;gt;lineEdit-&amp;gt;text() + &amp;quot;6&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        ui-&amp;gt;lineEdit_3-&amp;gt;setText(ui-&amp;gt;lineEdit_3-&amp;gt;text() + &amp;quot;6&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Widget::on_pushButton_7_clicked()&lt;br /&gt;
{&lt;br /&gt;
    if (QString::compare (ui-&amp;gt;lineEdit_2-&amp;gt;text(), &amp;quot;&amp;quot;) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        ui-&amp;gt;lineEdit-&amp;gt;setText(ui-&amp;gt;lineEdit-&amp;gt;text() + &amp;quot;7&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        ui-&amp;gt;lineEdit_3-&amp;gt;setText(ui-&amp;gt;lineEdit_3-&amp;gt;text() + &amp;quot;7&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Widget::on_pushButton_8_clicked()&lt;br /&gt;
{&lt;br /&gt;
    if (QString::compare (ui-&amp;gt;lineEdit_2-&amp;gt;text(), &amp;quot;&amp;quot;) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        ui-&amp;gt;lineEdit-&amp;gt;setText(ui-&amp;gt;lineEdit-&amp;gt;text() + &amp;quot;8&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        ui-&amp;gt;lineEdit_3-&amp;gt;setText(ui-&amp;gt;lineEdit_3-&amp;gt;text() + &amp;quot;8&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Widget::on_pushButton_9_clicked()&lt;br /&gt;
{&lt;br /&gt;
    if (QString::compare (ui-&amp;gt;lineEdit_2-&amp;gt;text(), &amp;quot;&amp;quot;) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        ui-&amp;gt;lineEdit-&amp;gt;setText(ui-&amp;gt;lineEdit-&amp;gt;text() + &amp;quot;9&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        ui-&amp;gt;lineEdit_3-&amp;gt;setText(ui-&amp;gt;lineEdit_3-&amp;gt;text() + &amp;quot;9&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Widget::on_pushButton_11_clicked()&lt;br /&gt;
{&lt;br /&gt;
    if (QString::compare (ui-&amp;gt;lineEdit_2-&amp;gt;text(), &amp;quot;&amp;quot;) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        ui-&amp;gt;lineEdit-&amp;gt;setText(ui-&amp;gt;lineEdit-&amp;gt;text() + &amp;quot;10&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        ui-&amp;gt;lineEdit_3-&amp;gt;setText(ui-&amp;gt;lineEdit_3-&amp;gt;text() + &amp;quot;10&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Widget::on_pushButton_10_clicked()&lt;br /&gt;
{&lt;br /&gt;
    ui-&amp;gt;lineEdit-&amp;gt;setText(&amp;quot;&amp;quot;);&lt;br /&gt;
    ui-&amp;gt;lineEdit_2-&amp;gt;setText(&amp;quot;&amp;quot;);&lt;br /&gt;
    ui-&amp;gt;lineEdit_3-&amp;gt;setText(&amp;quot;&amp;quot;);&lt;br /&gt;
    ui-&amp;gt;lineEdit_4-&amp;gt;setText(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Widget::on_pushButton_13_clicked()&lt;br /&gt;
{&lt;br /&gt;
    ui-&amp;gt;lineEdit_2-&amp;gt;setText(&amp;quot;+&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Widget::on_pushButton_14_clicked()&lt;br /&gt;
{&lt;br /&gt;
    ui-&amp;gt;lineEdit_2-&amp;gt;setText(&amp;quot;-&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Widget::on_pushButton_15_clicked()&lt;br /&gt;
{&lt;br /&gt;
    ui-&amp;gt;lineEdit_2-&amp;gt;setText(&amp;quot;*&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Widget::on_pushButton_16_clicked()&lt;br /&gt;
{&lt;br /&gt;
    ui-&amp;gt;lineEdit_2-&amp;gt;setText(&amp;quot;/&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Widget::on_pushButton_12_clicked()&lt;br /&gt;
{&lt;br /&gt;
    if (ui-&amp;gt;lineEdit_2-&amp;gt;text() == &amp;quot;+&amp;quot;)&lt;br /&gt;
        ui-&amp;gt;lineEdit_4-&amp;gt;setText(QString::number(ui-&amp;gt;lineEdit-&amp;gt;text().toInt(NULL, 10) + ui-&amp;gt;lineEdit_3-&amp;gt;text().toInt(NULL, 10)));&lt;br /&gt;
    else if (ui-&amp;gt;lineEdit_2-&amp;gt;text() == &amp;quot;-&amp;quot;)&lt;br /&gt;
        ui-&amp;gt;lineEdit_4-&amp;gt;setText(QString::number(ui-&amp;gt;lineEdit-&amp;gt;text().toInt(NULL, 10) - ui-&amp;gt;lineEdit_3-&amp;gt;text().toInt(NULL, 10)));&lt;br /&gt;
    else if (ui-&amp;gt;lineEdit_2-&amp;gt;text() == &amp;quot;*&amp;quot;)&lt;br /&gt;
        ui-&amp;gt;lineEdit_4-&amp;gt;setText(QString::number(ui-&amp;gt;lineEdit-&amp;gt;text().toInt(NULL, 10) * ui-&amp;gt;lineEdit_3-&amp;gt;text().toInt(NULL, 10)));&lt;br /&gt;
    else if (ui-&amp;gt;lineEdit_2-&amp;gt;text() == &amp;quot;/&amp;quot;)&lt;br /&gt;
        ui-&amp;gt;lineEdit_4-&amp;gt;setText(QString::number(ui-&amp;gt;lineEdit-&amp;gt;text().toInt(NULL, 10) / ui-&amp;gt;lineEdit_3-&amp;gt;text().toInt(NULL, 10)));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 파일 다루기 ==&lt;br /&gt;
=== 메모장 프로그램 ===&lt;br /&gt;
* Youtube : https://www.youtube.com/watch?v=5wbMaH50GdM&lt;br /&gt;
* 메모장 프로그램을 한번 만들어 봅시다.&lt;br /&gt;
[[파일:Editor_result.png]]&lt;br /&gt;
* 간단하게 만들어 본 프로그램입니다.&lt;br /&gt;
* TextEdit 컨트롤과 ListWidget 컨트롤, PushButton 컨트롤을 사용하였습니다.&lt;br /&gt;
* 헤더파일에 추가할 내용은 다음과 같습니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// 헤더 include&lt;br /&gt;
#include &amp;lt;QFileDialog&amp;gt;&lt;br /&gt;
#include &amp;lt;QMessageBox&amp;gt;&lt;br /&gt;
// Private 변수&lt;br /&gt;
    QDir dir;&lt;br /&gt;
    QFileInfoList list;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 소스코드는 다음과 같습니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Widget::on_pushButton_4_clicked()&lt;br /&gt;
{&lt;br /&gt;
    dir = QFileDialog::getExistingDirectory();&lt;br /&gt;
    dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);&lt;br /&gt;
    ui-&amp;gt;listWidget-&amp;gt;clear();&lt;br /&gt;
    list = dir.entryInfoList();&lt;br /&gt;
    for (int i = 0; i &amp;lt; list.size(); ++i) {&lt;br /&gt;
        QFileInfo fileInfo = list.at(i);&lt;br /&gt;
        ui-&amp;gt;listWidget-&amp;gt;addItem(QString(&amp;quot;%1&amp;quot;).arg(fileInfo.fileName()));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Widget::on_pushButton_clicked()&lt;br /&gt;
{&lt;br /&gt;
    QString path, filename;&lt;br /&gt;
    filename = QString(&amp;quot;%1&amp;quot;).arg(list.at(ui-&amp;gt;listWidget-&amp;gt;currentIndex().row()).absoluteFilePath());&lt;br /&gt;
    QFile file(filename);&lt;br /&gt;
    file.open(QIODevice::ReadOnly);&lt;br /&gt;
    ui-&amp;gt;textEdit-&amp;gt;clear();&lt;br /&gt;
    ui-&amp;gt;textEdit-&amp;gt;append(file.readAll());&lt;br /&gt;
    file.close();&lt;br /&gt;
    QMessageBox msgbox;&lt;br /&gt;
    msgbox.setText(&amp;quot;File Opened&amp;quot;);&lt;br /&gt;
    msgbox.exec();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Widget::on_pushButton_2_clicked()&lt;br /&gt;
{&lt;br /&gt;
    QString path, filename;&lt;br /&gt;
    filename = QString(&amp;quot;%1&amp;quot;).arg(list.at(ui-&amp;gt;listWidget-&amp;gt;currentIndex().row()).absoluteFilePath());&lt;br /&gt;
    QFile file(filename + &amp;quot;.text&amp;quot;);&lt;br /&gt;
    QByteArray bytearray = ui-&amp;gt;textEdit-&amp;gt;toPlainText().toUtf8().left(ui-&amp;gt;textEdit-&amp;gt;toPlainText().length());&lt;br /&gt;
    file.open(QIODevice::WriteOnly);&lt;br /&gt;
    file.write(bytearray);&lt;br /&gt;
    file.close();&lt;br /&gt;
    QMessageBox msgbox;&lt;br /&gt;
    msgbox.setText(&amp;quot;File Saved&amp;quot;);&lt;br /&gt;
    msgbox.exec();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Widget::on_pushButton_3_clicked()&lt;br /&gt;
{&lt;br /&gt;
    this-&amp;gt;close();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Widget::on_listWidget_doubleClicked(const QModelIndex &amp;amp;index)&lt;br /&gt;
{&lt;br /&gt;
    QString path, filename;&lt;br /&gt;
    filename = QString(&amp;quot;%1&amp;quot;).arg(list.at(index.row()).absoluteFilePath());&lt;br /&gt;
    QFile file(filename);&lt;br /&gt;
    file.open(QIODevice::ReadOnly);&lt;br /&gt;
    ui-&amp;gt;textEdit-&amp;gt;clear();&lt;br /&gt;
    ui-&amp;gt;textEdit-&amp;gt;append(file.readAll());&lt;br /&gt;
    file.close();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 좀 길어보이긴 하지만 다 했던 내용입니다.&lt;br /&gt;
* 연습문제 : 상단 메뉴바가 있는 MainWindow 프로그램으로 변환해 보세요.&lt;br /&gt;
&lt;br /&gt;
== 데이터베이스 다루기 ==&lt;br /&gt;
* sqlite를 이용하여 간단한 일기장을 만들어 보도록 하겠습니다.&lt;br /&gt;
[[파일:simple_diary_result.png]]&lt;br /&gt;
* QT에서는 기본적으로 sqlite3를 지원해 줍니다.&lt;br /&gt;
* ubuntu에서는 기본으로 sqlite2지만, sqlite3를 설치하면 됩니다.&lt;br /&gt;
* SQL 관련 내용을 사용하기 위해서는 pro 파일도 수정해야 합니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
QT       += core gui sql&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 위와 같이 sql을 추가해 줍니다.&lt;br /&gt;
* 추가하지 않으면 헤더를 추가해도 라이브러리가 참조되지 않아, 컴파일 에러가 납니다. 꼭 추가해 주어야 합니다.&lt;br /&gt;
* 이제, 헤더에 다음과 같은 내용을 추가합니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// 헤더 include&lt;br /&gt;
#include &amp;lt;QtSql/QtSql&amp;gt;&lt;br /&gt;
// private 변수&lt;br /&gt;
    QSqlDatabase db;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* sql 파일의 위치는 이따 소스코드에 직접 지정해 주세요.&lt;br /&gt;
* sql 파일은 sqlite3에서 다음과 같은 명령어로 생성하였습니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sqlite&amp;gt; create table note ( id INTEGER PRIMARY KEY AUTOINCREMENT, date text, title text, content text);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 소스코드는 다음과 같습니다.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void Widget::on_calendarWidget_clicked(const QDate &amp;amp;date)&lt;br /&gt;
{&lt;br /&gt;
    qWarning() &amp;lt;&amp;lt; date.toString();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Widget::on_pbOpen_clicked()&lt;br /&gt;
{&lt;br /&gt;
    QSqlQuery query;&lt;br /&gt;
    QString exeq;&lt;br /&gt;
&lt;br /&gt;
    int exist = 0;&lt;br /&gt;
&lt;br /&gt;
    query.clear();&lt;br /&gt;
    exeq = &amp;quot;select * from note where date ='&amp;quot; + ui-&amp;gt;calendarWidget-&amp;gt;selectedDate().toString() + &amp;quot;';&amp;quot;;&lt;br /&gt;
    query.exec(exeq);&lt;br /&gt;
    while(query.next())&lt;br /&gt;
    {&lt;br /&gt;
        QString date = query.value(0).toString();&lt;br /&gt;
        ui-&amp;gt;leTitle-&amp;gt;setText(query.value(&amp;quot;title&amp;quot;).toString());&lt;br /&gt;
        ui-&amp;gt;teContent-&amp;gt;clear();&lt;br /&gt;
        ui-&amp;gt;teContent-&amp;gt;appendPlainText(query.value(&amp;quot;content&amp;quot;).toString());&lt;br /&gt;
        exist = 1;&lt;br /&gt;
    }&lt;br /&gt;
    if(!exist)&lt;br /&gt;
        qWarning() &amp;lt;&amp;lt; &amp;quot;None&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Widget::on_pbExit_clicked()&lt;br /&gt;
{&lt;br /&gt;
    db.close();&lt;br /&gt;
    this-&amp;gt;close();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Widget::on_pbSave_clicked()&lt;br /&gt;
{&lt;br /&gt;
    QSqlQuery query;&lt;br /&gt;
    QString exeq;&lt;br /&gt;
&lt;br /&gt;
    query.clear();&lt;br /&gt;
    exeq = &amp;quot;insert into note (date, title, content) values ('&amp;quot; + ui-&amp;gt;calendarWidget-&amp;gt;selectedDate().toString()+&amp;quot;', '&amp;quot;+ui-&amp;gt;leTitle-&amp;gt;text()+&amp;quot;', '&amp;quot;+ui-&amp;gt;teContent-&amp;gt;toPlainText()+&amp;quot;');&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* 연습문제 : 노트패드의 경우와 같이, 메뉴가 되어 있는 프로그램으로 변경해 봅시다. 데이터베이스 생성도 같이.&lt;br /&gt;
&lt;br /&gt;
== 네트워크 프로그래밍 ==&lt;br /&gt;
=== 채팅 ===&lt;br /&gt;
* 네트워크 어플리케이션의 시작은 채팅 프로그램입니다.&lt;br /&gt;
* 아래 파일은 서버 / 클라이언트가 함께 동작하는 예제 프로그램입니다.&lt;br /&gt;
[[File:qt-network-chat.zip]]&lt;br /&gt;
== 제목 ==&lt;/div&gt;</summary>
		<author><name>163.152.61.183</name></author>
	</entry>
</feed>