QT 튜토리얼 7,8에 나오는 connect에 대한 질문.

hanseok의 이미지

    
   connect( slider, SIGNAL(valueChanged(int)),
	     lcd, SLOT(display(int)) );
   connect( slider, SIGNAL(valueChanged(int)),
	     SIGNAL(valueChanged(int)) );

7,8 장에 이런 구문이 나옵니다.

이것중..
두번째 나오는것에 대해서 이해가 잘 되지 않습니다.

slider의 값이 바뀌면 시그널을 발생시키고
그 시그널에 의하여 동일 시그널을 또 발생시킨다면 //무한루프가 아닌지?

시그널이 수행되지 않은 상태에서 동일 시그널이 발생하면 무시한다면..~~ // ..

이해가 계속 안되네요..

설명 부탁드리겠습니다.

익명 사용자의 이미지

세번째 인자 this가 빠졌네요
slider에 시그널이 발생하면
LCDRange에도 시그널을 발생시키는 건데요

doldori의 이미지

두 번째 문장은 좀 잘못 쓰셨군요.

connect(slider, SIGNAL(valueChanged(int)),
        this, SIGNAL(valueChanged(int)));

slider와 this가 서로 다른 개체이고 따라서 동일한 시그널이 아니므로 무한 루프에
빠지지 않습니다. 만약 다음처럼 한다면 무한 루프에 빠지겠죠.
connect(slider, SIGNAL(valueChanged(int)),
        this, SIGNAL(valueChanged(int)));
connect(this, SIGNAL(valueChanged(int)),
        slider, SIGNAL(valueChanged(int)));

이것과 main.cpp의 MyWidget 생성자 내에서의 connect()가 어떻게 연동이
되는지 잘 따져보세요.
hanseok의 이미지

#ifndef LCDRANGE_H
#define LCDRANGE_H

#include <qvbox.h>

class QSlider;


class LCDRange : public QVBox
{
    Q_OBJECT
public:
    LCDRange( QWidget *parent=0, const char *name=0 );

    int value() const;

public slots:
    void setValue( int );

signals:
    void valueChanged( int );

private:
    QSlider *slider;
};


#endif // LCDRANGE_H

/****************************************************************
**
** Implementation of LCDRange class, Qt tutorial 7
**
****************************************************************/

#include "lcdrange.h"

#include <qslider.h>
#include <qlcdnumber.h>

LCDRange::LCDRange( QWidget *parent, const char *name )
        : QVBox( parent, name )
{
    QLCDNumber *lcd  = new QLCDNumber( 2, this, "lcd"  );
    slider = new QSlider( Horizontal, this, "slider" );
    slider->setRange( 0, 99 );
    slider->setValue( 0 );
    connect( slider, SIGNAL(valueChanged(int)),
	     lcd, SLOT(display(int)) );
    connect( slider, SIGNAL(valueChanged(int)),
	     SIGNAL(valueChanged(int)) );
}

int LCDRange::value() const
{
    return slider->value();
}

void LCDRange::setValue( int value )
{
    slider->setValue( value );
}

위의 코드에서 보시면.
connect( slider, SIGNAL(valueChanged(int)),
lcd, SLOT(display(int)) );
connect( slider, SIGNAL(valueChanged(int)),
SIGNAL(valueChanged(int)) );
이와 같은 코드에서
this가 생략된것은 이해 했습니다.

두번째 connect 가 호출하는(?) valueChanged(int) <== 이것은 무엇을 호출하게 되는것인가요?
slider에서 값이 바뀌게 되면 LCDRange의 valueChanged(int)를 호출하게 되는데
signals:
void valueChanged(int);
선언만 되어 있고 구현된 부분은 없습니다.

#include <qpushbutton.h>
#include <qlcdnumber.h>
#include <qfont.h>
#include <qvbox.h>
#include <qgrid.h>

#include "lcdrange.h"


class MyWidget : public QVBox
{
public:
    MyWidget( QWidget *parent=0, const char *name=0 );
};


MyWidget::MyWidget( QWidget *parent, const char *name )
        : QVBox( parent, name )
{
    QPushButton *quit = new QPushButton( "Quit", this, "quit" );
    quit->setFont( QFont( "Times", 18, QFont::Bold ) );

    connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) );

    QGrid *grid = new QGrid( 4, this );

    LCDRange *previous = 0;
    for( int r = 0 ; r < 4 ; r++ ) {
	for( int c = 0 ; c < 4 ; c++ ) {
	    LCDRange* lr = new LCDRange( grid );
	    if ( previous )
		connect( lr, SIGNAL(valueChanged(int)),
			 previous, SLOT(setValue(int)) );
	    previous = lr;
	}
    }
}


int main( int argc, char **argv )
{
    QApplication a( argc, argv );

    MyWidget w;
    a.setMainWidget( &w );
    w.show();
    return a.exec();
}

잠이 들어야지만 꿈을 꿀수 있는것인가?
우리는 항상 꿈을 쫓아 가며 살아가는 사람들..

doldori의 이미지

hanseok wrote:
두번째 connect 가 호출하는(?) valueChanged(int) <== 이것은 무엇을 호출하게 되는것인가요?
slider에서 값이 바뀌게 되면 LCDRange의 valueChanged(int)를 호출하게 되는데
signals:
void valueChanged(int);
선언만 되어 있고 구현된 부분은 없습니다.

MOC(meta-object compiler)가 만들어 줍니다. 빌드하고 나면 moc_*.cpp가
생기는데 그 안에 들어 있습니다.

여담이지만 Qt의 MOC는 type-safe 하지 않다는 문제가 있습니다. 예를 들어
다음과 같이 바꾸고 빌드하면 경고 하나 없이 깨끗이 빌드되지만 제대로 동작하지
않습니다. 디버거로 실행하면 그런 시그널이 없다는 메시지가 뜨긴 하지만요.
문자열로 콜백 함수 테이블을 매핑하기 때문인 듯 합니다. 그래서 connect()를 쓸
때는 함수 타입이 맞는지 주의해야 하지요.

connect(slider, SIGNAL(valueChanged(int)), 
        this, SIGNAL(valueChanged())); 
hanseok의 이미지

doldori wrote:

MOC(meta-object compiler)가 만들어 줍니다. 빌드하고 나면 moc_*.cpp가
생기는데 그 안에 들어 있습니다.

음.. qmake 로만 해서.~ mod 라는것이 있는것은 알았지만 고민을 해보지 않았네요.~

감사합니다. ~

한가지는 해결했지만 아직 SIGNAL과 SLOT 에 대해서
무엇인가 찜찜한 기분이~ 가시지 않네요..

잠이 들어야지만 꿈을 꿀수 있는것인가?
우리는 항상 꿈을 쫓아 가며 살아가는 사람들..

hanseok의 이미지

LCDRange::LCDRange( QWidget *parent, const char *name ) 
        : QVBox( parent, name ) 
{ 
    QLCDNumber *lcd  = new QLCDNumber( 2, this, "lcd"  ); 
    slider = new QSlider( Horizontal, this, "slider" ); 
    slider->setRange( 0, 99 ); 
    slider->setValue( 0 ); 
    connect( slider, SIGNAL(valueChanged(int)), 
        lcd, SLOT(display(int)) ); 
    connect( slider, SIGNAL(valueChanged(int)), 
        SIGNAL(valueChanged(int)) ); 
} 

쩝. 이곳에서 첫번째 connect 는 slider에서 발생하는 이벤트..
를. display에 연결

두번째는 slider에서 발새한 이벤트를 LCDRange와 관련된 것을 호출한다.

깔끔.. 이해..

잠이 들어야지만 꿈을 꿀수 있는것인가?
우리는 항상 꿈을 쫓아 가며 살아가는 사람들..

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.