Qwidget

버튼을 버튼안에 넣을수있다.

자식을 생성할때 부모를 참조하면된다.

부모가 제거될때 자식도 사라진다.


이런식으로 계층구도를 짜나갈수있다.

자식의 위치는 부모의 위치기준으로 생성된다.

////////////////////////////////////////

QWidget은 콘테이너형식이다.

담을수있는 공간이라고보면됨.

////////////////////////////////////////

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <QApplication>
#include <QPushButton>
int main(int argc, char **argv)
{
 QApplication app (argc, argv);
 QWidget window;
 window.setFixedSize(10050);
 QPushButton *button = new QPushButton("Hello World"&window);
 button->setGeometry(10108030);
 window.show();
 return app.exec();
}
cs

window라는 이름의 위젯을 생성한다 ->콘테이너가 되줌

window의 크기를 설정

window를 부모로 하는 자식버튼 동적으로 생성

버튼 생성위치 설정

window를 보여준다 ->부모를 보여주면 자식도 다보여줌

////////////////////////////////////////

거의 모든 ui 툴킷들은 유저의 행동을 감지하고,반응하는 메카니즘을 가지고있다.

콜백을쓰거나, 리스너를 사용하거나.. 그러나 근본적으로 모든 유아이들은 

observer pattern이다.

observer pattern 은 관찰가능한 객체가 다른 관찰가능한 객체에게 변화를 알리고싶을때

사용된다.

ex)유저가 버튼을 클릭하면(변화) 메뉴가 생성된다.(변화감지후 이벤트)
ex)웹페이지 로딩이끝났을때,로딩된페이지에서 정보를 추출한다.
ex)아이템리스트를 스크롤했을때,끝에 다다르면 다른아이템도 나타나야한다.

observer pattern은 많은 gui어플리케이션에서 사용된다.

그때 많은 자리를 차지하는 코드가 쓰일수있는데 그 문제를 해결하기위해

큐티에선 signal and slots 메카니즘을 사용한다.

////////////////////////////////////////

Signals and slots

관찰가능한 객체와 관찰자를 갖고 사용하는대신 qt는 하이레벨개념의

signal and slot을 제공한다.

signal은 객체가 보내는 메시지이다. 많은 시간동안 변화상태를 전달한다.

slot은 시그널을 받고 반응하는 이벤트,함수라고 보면된다.

시그널에관해 QPushButton class를 보자.

clicked,pressed,released 가 있다.

딱봐도 뭐하는지 알수있다. 이 signal들은 유저가 클릭하고,누르고,놨을때 보내진다.

자 그럼 슬롯에 관해 여러가지를 보자.

QApplication::quit
QWidget::setEnabled
QPushButton::setText

이러한 종류들이 슬롯이다.

슬롯이 시그널에 반응하기위해서는 슬롯은 시그널과 connect되있어야 한다.

Qt에서는 QObject::connect를 제공한다.

connect메서드는 SIGNAL,SLOT매크로를 사용하여 사용된다.

1
2
3
4
FooObjectA *fooA = new FooObjectA();
FooObjectB *fooB = new FooObjectB();
QObject::connect(fooA, SIGNAL (bared()), fooB, SLOT (baz()));
cs
////////////////////////////////////////

-정보전달

signal and slot을 사용하여 이벤트 발생 버튼을 만들어보자.

음악을 재생하는동안, progress bar는 음악이 끝날동안 얼마나 음악을 유지할것인지

보여준다. 아마 음악플레이어는 미디어의 과정을 체크하는 클래스가 있을것이다.

그 클래스의 인스턴스는 계속해서 과정의 값을 체크해주는 시그널을 보낼것이다.

그 신호는 progress bar에 전달될것이다.

void MediaProgressManager::tick(int miliseconds);

에서 시그널을 주면

void QProgressBar::setValue(int value);에서 시그널을 받아서 값을 set한다.

이처럼 시그널과 슬롯은 같은 parameter을 써야 오류가 안생긴다.

시그널에서 보내준 정보를 슬롯에서 parameter로써 사용하기 때문이다.

1
2
3
4
MediaProgressManager *manager = new MediaProgressManager();
QProgressBar *progress = new QProgressBar(window);
QObject::connect(manager, SIGNAL (tick(int)),
 progress, SLOT (setValue(int)));
cs

이처럼 보낼정보와 정보의 형태를 기술해야한다. 정보의 이름도 쓰면 좋다.

////////////////////////////////////////
signals and slots의 특징

1.하나의 시그널은 여러 슬롯과 연결가능하다.

2.많은 시그널들은 하나의 슬롯과 연결가능하다.

3.시그널과 시그널이 연결가능하다.이때 두번째시그널은 첫번째 시그널을 받고 전달된다.

////////////////////////////////////////
이벤트를 만들어보자.

버튼을 누르면 앱이 꺼지는 이벤트를 만들어보자.

프로그램 전체를 관리하는 QApplication의 quit 슬롯에 시그널을 보내주면되겠다!

그런데 QApplication의 quit슬롯에 시그널을 보내주기위해선 그 인스턴스를 알아야한다.

QApplication는 instance를 만들어주는 static Function이 있다. 

그러니까 QApplication::instance()를 인스턴스처럼 쓰면된다.!

1
2
  connect(m_button, SIGNAL (clicked()),
 QApplication::instance(), SLOT (quit()));
cs

.이런식으로 커넥트 시켜주면되겠다. 버튼이 클릭되면 앱이 종료된다.

////////////////////////////////////////

QProgressbar와 QSlider를 인스턴스화 시키고 커넥트해보자.

여기서 시그널은 QSlider::valueChanged(int value);
슬롯은 QProgressBar::setValue(int value);
이다.

슬라이더에서 값을 조정하면 그값만큼 프로그래스바 값이 변화한다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <QApplication>
#include <QProgressBar>
#include <QSlider>
int main(int argc, char **argv)
{
 QApplication app (argc, argv);
 // Create a container window
 QWidget window;
 window.setFixedSize(20080);
 // Create a progress bar
 QProgressBar *progressBar = new QProgressBar(&window);
 progressBar->setRange(0100);
 progressBar->setValue(0);
 progressBar->setGeometry(101018030);
 // Create a horizontal slider
 QSlider *slider = new QSlider(&window);
 slider->setOrientation(Qt::Horizontal);
 slider->setRange(0100);
 slider->setValue(0);
 slider->setGeometry(104018030);
 window.show();

 QObject::connect(slider, SIGNAL (valueChanged(int)),
  progressBar, SLOT (setValue(int)));
 return app.exec();
}
cs
천천히 생각해보자
12//메인 윈도우를 생성한다. widget으로 생성한다.

16//프로그래스바를 메인윈도우의 자식으로 생성한다.
17//표현할 범위를 설정한다.
18//처음값을 설정한다.
19//위치를 설정한다.

22//슬라이더를 메인윈도우의 자식으로 생성한다.
23//슬라이더를 수평형식으로 설정한다.
24//범위를 설정한다.
25//초깃값을 설정한다.
26//위치설정한다.

28//메인윈도우를 보여준다.

30//슬라이더와 프로그래스바를 커넥트시켜준다.



댓글

이 블로그의 인기 게시물

QtWidget의 계층구조

About 연산자 함수