달력

112024  이전 다음

  • 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

QT의 Project파일('.pro')을 편집하다 보면 INCLUDEPATH 명령어에 실제 경로명이 'include'인 폴더를 추가하면 동작이 제대로 안되는 가끔 있다. QT는 CMake를 사용하고 include는 CMake에서 사용하는 함수중 하나이기 때문에 경로명에 포함되어 있는 'include'를 키워드로 인식할 경우이다.


이 경우 CMake의 quote 함수를 사용하면 모든 문제는 해결되지만...

그냥 'INCLUDEPATH += ./include' 이렇게 해줘되 된다. ㅡ,.ㅡ





Posted by 생짜
|

<<Previous - Display Order(2)


QML Object를 동적으로 생성하는 방법에 대한 설명은 아래 링크를 따라 가면 된다.

Dynamic QML Object Creator( http://doc.qt.io/qt-5/qtqml-javascript-dynamicobjectcreation.html )


QML 파일을 동적으로 생성하기 위해서는 Qt 객체의 함수 두 개를 사용해야 한다.

첫 번째로 Qt.createComponent() 를 이용하여 Component를 생성하거나 Qt.createQmlObject() 를 사용하여

문자열로 QML 객체를 정의하여 만들 수 있다.

두 번째로 QML 객체가 생성되면 Qt.createObject() 를 이용하여 생성된 객체에 속성 값을 설정한다.


첫 변째 두 함수의 차이는 Qt.createComponent()는 첫 번째 인자로 QML 객체(소스) URL을 전달하고 Qt.createQmlObject()은 첫 번째 인자로 QML 객체를 정의하고 있는 string을 넘겨준다.


Qt.createComponent()를 이용하여 간단한 javascript함수를 만들면 아래와 같다.

function create_qml_object(qmlfile_url, parent_id) {

    if(qmlfile_url == "") return undefined;


    var component = Qt.createComponent(qmlfile_url);

    if(component.status == Component.Ready) {

        var appobj = component.createObject(parent_id, {"x":0, "y":0, "width":0, "height":0});

        if (appobj != null) {

            appobj.visible = false;

            component.destroy();

            return appobj;

        }

    }

    component.destroy();

    return undefined;

}



create_qml_object 함수를 이용한 예제:

[main.qml]


[Rect.qml]


QML Display Order를 할 수 있는 z Order, Loader 객체 이용, 객체 Creator 세가지 방법에 대해 모두 알아봤다.

사실 Loader객체와 객체를 Creator하는 방법은 QML Display Order에 상관있는 부분은 아니다. 하지만 QML 파일을  필요할 때 생성하고 삭제 하면 Display하는데 조금이나마 유리할 수 있다. 

exQMLCreator.tar.gz


Posted by 생짜
|

<<Previous - Display Order(1)


Loader Object는 URL( source ) 또는 Component Object를 이용하여 동적으로 QML 구성 요소를 생성하는데 사용된다. 

Loader는 QML 파일 (source 속성 사용) 또는 Component 객체 (sourceComponent 속성 사용)를 로드 할 수 있다. 필요에 따라 구성 요소를 작성해야하거나 성능상의 이유로 구성 요소를 불필요하게 작성하지 않아야 할 때까지 구성 요소의 작성을 지연시킬 때 유용하다.


다음은 Row에 Repeater 객체를 이용하여 Rectangle을 5개 만들고 각 Rectangle를 클릭할 때마다 Loader 객체를 이용하여 동적으로 QML 구성 요소를 로드하는 예제이다. 

 



Row 객체 안에 Repeater 객체를 선언하고 Repeater의 model 속성에 5개의 값을 주면 Repeater 객체 안에 선언되어 있는 visual 객체( 여기서는 Rectangle )를 model 수만큼 Row로 생성한다. ( Column 객체안에 Repeater가 선언되어 있다면 Column 형태로 객체가 생성된다. )  MouseArea 객체는 visual 객체 안에서 선언 할 수 있기 때무에 Rectangle 객체의 자식으로 선언되었다. MouseArea 객체안의 index 속성은 Repeater 객체에서 주는 속성이다. 이기 때문에 따로 선언을 하지 않아도 된다. 


[Rect1.qml]


[Rect2.qml]


<1> Rectangle 를 클릭하면 'id_loader'에 source로 "Rect1.qml" 파일을 설정한다. ( main.qml의 Line 38 부터 )

active = false는 혹시 몰라 load되어 있는 qml 파일을 삭제 하는 것이다. Rect1.qml 파일을 load 한 후 active = true를 해줘야 한다. Rect1.qml 을 load한 후 id_loader.item( item은 id_loader에 load되어 있는 객체를 가르킨다. 여기서는 Rect1.qml 객체이다.) 을 이용하여 Rect1.qml에 파일에 있는 객체에 값을 셋팅한다. ( id_loader.item.strTxt = "test" )

Rect1의 확인을 클릭하면 id_loader로 exit signal을 보낸다. blue Rectangle을 클릭하면 id_loader로 Rect1이 signal을 보내고 이 signal을 받은 id_loader가 다시 Rect1에 signal을 보낸다. 이로써 Loader 객체를 사용하여 동적으로 QML 파일을 생성해도 signal 통신 및 생성된 객체에 값을 전달하는 것도 가능하다는 것을 알 수 있다.

<2> Rectangle을 클릭하면 (2) 화면의 red Rectangle이 생성된다. 이 때 active = false를 해줌으로써 전에 로드 되어 있던 Rect1.qml은 삭제, 다시 source에 Rect2.qml을 로드한다. 함수 테스트를 위해 javascript 함수를 만들어서 사용해 봤다.

<3> Rectangle을 클릭하면 단순하게 id_loader의 속성인 visible에 true/false값을 할당하여 id_loader를 보였다 안보였다만 할 뿐이다. id_loader에 할당되어 있는 Rect2.qml은 그대로이다. 

<4> 은 Loader의 source 가 아니라 sourceComponent 속성을 이용하여 파일이 아니라 Component 객체를 로드한 예이다. Component 객체는 main.qml 에 기술되어 있지만 loader를 통해 로딩되기 전까지는 객체가 아니다. 객체가 아니기 때문에 선언되어 있어도 보이지 않는 것이다.

<5>은 visible 속성이 아니라 active 속성을 이용하여 보였다 안보였다 하는 것으로 이 경우 보이는 것이아니라 객체 자체를 해제했다 할당했다 하는 것이다.


exLoader.tar.gz


Next >>

Posted by 생짜
|

QML은 declarative 언어이기 때문에 위에서부터 선언된 순서대로 Display를 한다.

결국 맨 마지막에 있는 Item이 그려진다는 이야기이다.

다시말해 현재 Item은 바로 위의 Item을 덮는다.

이걸 방지하기 위한 property로 'z' 가 있다. z order는 형제 Item 또는 부모 Item 에게만 적용된다.

즉 부모 Item의 아래에 선언되어 있는 Item 에게는 상위의 z값을 설정해도 적용 되지 않는다.


'결국 맨 마지막에 있는 Item이 최상위에 그려진다는 이야기이다'


이 현상을 막기 위해 몇가지 방법이 있다.

첫번째는 Loader 객체를 최하위에 두고 QML 파일을 Loader를 이용하여 동적으로 할당 하는 것이다.

두번째는 QML 파일을 Loader를 이용하지 않고 create하는 방법이다.


exZorder.tar.gz




Display Order(2) - Use Loader Object >>


Posted by 생짜
|

QML에서 Image file을 loag할 경우 Image 객체의 property source에 파일 경로를 적어 주면 된다.

Image {

 source: "file:///home/ryuhs74/work/testimage/image.png"

}

중요 포인트는 'file:///' 이다. 이미지 파일의 절대경로를 기술해주면 된다.


QT에서 QImage 클래스의 load 함수를 이용하여 이미지 파일을 load 할 때 이미지 파일의 경로를 QML과 똑같이 사용하니 load함수에서 false이 리턴됐다.  QT에서는 그냥 파일경로를 적어주면 되는 것이었다.

void CImage::paint(QPainter *painter)

{

    QImage image;

    if( true == image.load("/home/ryuhs74/work/testimage/image.png", "PNG") )

    {

#if 0 //QPixmap 클래스를 사용하는 방법

        QRectF target(0.0, 0.0, 640.0, 700.0);

        QRectF source(0.0, 0.0, 640.0, 700.0);

        QPixmap pixmap("/home/telecons/work/SYMC_C300/testimage/map_bg.png");

        painter->drawPixmap(target,pixmap,source);

#else

        painter->drawImage(200,200, image);

#endif

    }

    else

    {

        QPen pen(m_color, 2);

        painter->setPen(pen);

        painter->setRenderHints(QPainter::Antialiasing, true);

        painter->drawPie(boundingRect().adjusted(1, 1, -1, -1), 90 * 16, 290 * 16);

    }



Posted by 생짜
|

.pro( Qt Project file )

QT Creator로 프로젝트를 생성하면 해당 프로젝트 명의 '.pro' 프로젝트 파일이 생성된다.  '.pro'  파일은 QT 프로젝트를 구성하는 파일이고 qmake 를 통해 자동적으로 Makefile을 만들 수 있다. 


.pri( Qt Project Include file )

.pri 파일은  .pro 파일의 형식과 완전히 동일하고 일반적으로 프로젝트 포함 파일이라고 한다. 기본적으로 기능을 공유하기 위해 프로그래밍 언어로 모듈을 포함하는 것과 유사하다. 공통적으로 필요한 환경을 .pri파일에 설정하고 .pro파일에 'include( .pri 파일 경로)' 또는 'include($$PWD/***.pri)' 해서 사용한다.


qmkae

유닉스/리눅스에서 컴파일 할 때 주로 Makefile을 사용하지만 Makefile 자체를 익히는데는 많은 시간이 필요하다.

Makefile을 쉽게 생성해주는 여러가지 툴들이 있는 qmake는 QT에서 주로 사용하는 다중 플랫폼용 Makefile 생성툴이다.

QT Project를 생성하면 '.pro' 파일이 생성되는데 '.pro'파일에 qmake 문법에 맞게 기술한 후 'Run qmake'를 실행하면

유닉스, 리눅스 용 Makefile이 생성된다. ( Run qmake는 QT Creator 에서 Popup 메뉴로 실행 시킬 수 있다. )

Qmake에 대한 자세한 사항은 qmake Manual , qmke Function Reference 을 참고하면 된다.

'.pro' 파일에 기술하는 qmake 문법은 유닉스/리눅스에서 사용하는 쉘스크립트 문법과 유사하다.

qmake에서 사용하는 시스템 변수에 값을 대입하면 된다.

주석은 '#'로 시작한다. '.pro' 또는 '.pri' 파일내에서 변수를 사용할 수 있는데 사용할 변수 앞에 '$$'를 붙여 주면 된다.

여러줄을 기술할 때는 '\'( 백슬러시 )를 사용하면 된다.


INCLUDERPATH = $$PWD \

                          ./lib

HEADERS = ../hdr
SOURCE = main.cpp \
               $$INCLUDERPATH

SOURCE += ../src


qmake의 시스템 변수

TEMPLATE

프로젝트 파일의 타입을 정의한다. app, vcapp, lib, vclib, subdirs 등이 올수 있다.

TEMPLATE = app : 독입적인 어플리케이션 (default값이다. 생략하면 app가 기본)

TEMPLATE = lib : static lib 또는 shared lib

TEMPLATE = subdirs : 내용은 없고 하위 디렉토리를 정의한다는 의미이다.

HEADERS 

해터파일을 적는다.

ex) HEADERS += animateditem.h

 

SOURCES

소스파일이다.

SOURCES += ledmeter.cpp main.cpp toplevel.cpp view.cpp

 

TARGET

실행파일의 이름이다. 보통 gcc 컴파일 시 –o 옵션 뒤에 붙는 이름이다.

생략 시 .pro 파일 앞에 붙는 이름이 default 값이 된다.

 

DEFINES

Define . gcc 컴파일 시 –D  옵션뒤에 붙는 옵션이다.

ex) DEFINES += HAVE_KEYBOARD

 

LIBS

프로젝트에 링크할 라이브러리를 지정한다.

라이브러리는 절래경로를 사용해 지정하거나 –L 옵션과 –l 과 같이 사용된다.

ex) LIBS += -lpng -L../../lib

 

INCLUDEPATH

전역 헤더 파일의 위치를 찾기위한 경로 지정. –I 옵션과 같은 역할

ex) INCLUDEPATH += ../shared

 

DESTDIR

실행 이미지가 설치될 디렉토리를 지정한다. 기본값은 플랫폼에 따라 다른데, 리눅스의 경우 현재 디렉토리에 실행파일이 생성되고, 윈도우에서는 debug나 release 디렉토리 아래 생성된다.

ex) DESTDIR = ../../../../bin

 

DEPENDPATH

QMAKE가 dependency 검색 시 사용되는 경로를 지정한다.

ex) DEPENDPATH = ../../include


MOC_DIR

moc 파일들이 생성되는 경로를 지정한다.

ex) MOC_DIR=$$OUT_PWD/.moc

 

SUBDIRS

하위 디렉토리에 있는 .pro 파일을 재귀적으로 호출될 수 있도록 하위 디렉토리를 지정한다.

ex) SUBDIRS += qtestlib designer

 

FORMS

uic에 의해 처리되는 QT디자이너로 생성된 .ui파일을 지정한다.

ex) FORMS += mainwindow.ui

 

RESOURCES

rcc에 의해 처리되는 실행파일내에 포함되는 리소스파일을 정의한 xml파일 .qrc를 지정한다.

ex) RESOURCES += assistant.qrc

 

VERSION

target 라이브러리의 버전 번호를 지정한다.

ex) VERSION=$${QT_MAJOR_VERSION}.$${QT_MINOR_VERSION}

 

DLLDESTDIR

dll파일이 설치될 경로를 지정한다. (디폴트값은 DESTDIR)

ex) DLLDESTDIR = $$OUTPUT_DIR/bin

 

QT

프로젝트에 사용될 Qt의 모듈을 지정한다.

디폴트값은 core 와 gui이다. 이는 QtCore 모듈과 QtGui 모듈을 포함한다는 의미이다.

QT에 지정되는 모듈은 대랴

core gui network opengl sql svg xml xmlpatterns qt3support 등이 있다.

Qt Creator에서 Qt모듈을 클릭하여 설정하는데 설정 시 .pro파일에 선택된 모듈들이 포함되는 것을 볼 수 있다.


CONFIG

CONFIG 변수는 빌드시 다양한 옵션들을 제어하기 위해 사용된다.

CONFIG += release warn_on qt 등의 형식으로 사용된다.

CONIFG와 사용되는 변수들

debug

 compile with debug options enabled

 release

 compile with optimization enabled, ignored if debug is specified

 warn_on

 The Compiler should emit more warnings than normally

 warn_off

 The Compiler should emit no warnings or as few as possible

 ordered

 Order subdirectories so parallelized builds work

 qt

 The target is a Qt application/library and requires Qt header file/library

 opengl

 The target require the OpenGL(or Mesa)

 thread

 The target is a multi threaded application or library

 x11

 The target is an X11 application or library

windows 

 The target is Win32 window application

 console

 The target is a Win32 console application

 shared

 The target is a shared object/DLL

 static

 The target is a static library

 plugin

 The target is a plugin(requires TARGET=lib, and implies shared)

 exceptions

 Turn on compiler exception support

 rtti

 Turns on compiler RTTI support

stl 

 Turns on Qt STL support

 flat

 only for TEMPLATE=vcapp; puts all sources files into one group and all header files into another group, independedt of the directory structure



 qmake의 내장함수

조건문

기본 문법은 아래와 같다.

condition {

    then-case

} else {

    else-case

}

{ 문은 반드시 condition 옆에 있어야 하고 }는 하나의 라인이어야 한다.

즉,

condition

{

then-case } 등으로 인식되지 않는다.

 

이제 사용예를 보자

win {

   debug {

      SOURCE += debug.cpp

   } else {

      SOURCE += release.cpp

   }

}

 

위 문장은 다음과 같이 사용할 수 있다.

condition:then-case

사용예

debug:SOURCE+=debug.cpp

else:SOURCE+=release.cpp

 

이경우 !(이 아닐경우)를 사용할 수 있다.

!debug:SOURCE+=release.cpp

 

isEmpty(variablename)

변수가 비었는지를 검사한다.

사용예

isEmpty(VERSION) {

   VERSION=4.3.0

}

 

CONFIG(config)

조건분과 유사하다. mutual exclusion을 사용할 수 있다.

사용예

CONFIG(release) {

   then-case

}




Posted by 생짜
|

RESOURCES:

Specifies the name of the resource collection files (qrc) for the target. 

QML인 경우 RESOURCES 폴더에 qml(.qrc) 파일이 존재해야 한다.


DISTFILES:

Specifies a list of files to be included in the dist target. This feature is supported by UnixMake specs only. 

dist 대상에 포한될 파일 목록을 지정한다. UnixMake 사양에서만 지원된다.


OTHER_FILES:

This seems in fact undocumented, at least I could not find anything. As far as I can tell all files listed here are only linked in project explorer (of Qt Creator for example) and are not treated in any way by qmake.

프로젝트의 일부이지만 "BUILD"가 아닌 파일들, readme, 빌드 힌트 또는 기타 내용과 같을 수 있다.

또는 '.pro' 파일 에서 'DISTFILES += ' 에 include하는 파일을 나타낼 수도 있다.


.pro 파일에 DISTFILES 가 존재


.pro 파일에 DISTFILES가 없을 경우




Posted by 생짜
|