달력

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
  • char* To QByteArray

 QByteArray databuf;


 databuf = QByteArray(reinterpret_cast<char*>(buf), 10);

 databuf = QByteArray((char*)buf, 10);

 databuf = QByteArray::fromRawData(buf, 10); 


  • QByteArray To char*

 QByteArray data;


 const std::size_t count = data.size();

 unsigned char* hex =new unsigned char[count];

 std::memcpy(hex,data.constData(),count);


 char* pData = data.data();



Posted by 생짜
|

QAudioOutput 을 이용해서 PulseAudio로 wav를 출력하고 있었다.

OGG 파일을 출력해야 한다고 한다.

엥? OGG ? [ 위키백과 ]


그냥 audio파일 중 하나겠지 하고 QFile로 open한 다음 버퍼에 데이타를 넣어줬다.

???

아무 소리가 나지 않는다.

언제나 그렇듯 한큐에 되는 것은 아무것도 없다. 제길~~~~

검색을 시작했다.

QT Forum 에 가니 기본적으로 QT Multimedia는 플랫폼 코덱을 사용한다고 한다.

Stack overflow 에 한번 더 가보자, Vorbis용 코덱이 설치되어 있지 않으면 재생할 수 없단다.

이번엔 Vorbis 를 찾아보자. vorbis를 찾다가 GitHub에서 유용한 샘플 코드를 찾았다. 앗싸~~~

바로 다운 받아 컴파일 들어간다.

GitHub 주소 여기고, 코드는 여기  QOggSimplePlayer.tar.gz

GitHub ReadME를 보면 QT Application에서 codec 없이 ogg 파일을 플레이 할 수 있는 소스란다.



자 이제 작업 시작해 보자.

GitHub 소스코드나 첨부되어 있는 코드를 다운받아 컴파일 하면 다음과 같은 header 파일이 없다고 에러가 난다.



우분투에 libogg-dev와 libvorbis-dev가 설치되어 있는지 확인한다.


내 우분투에서는 설치되어 있다고 나온다. 이 글을 쓰기 바로전에 샘플 코드를 돌려보기 위해 설치했다.

설치를 안했다면 OGG 관련 lib-dev를 아래와 같이 설치해야 한다.


  • apt-get upddate 저장소 업데이트

sudo apt-get update

sudo apt-get install libogg-dev

  • libvorbis-dev 설치

sudo apt-get install libvorbis-dev


이제 GitHub의 코드가 컴파일 될 것이다. 진짜!!!

이렇게 해도 컴파일 에러가 난다. 

GitHub에 있는 코드는 오래된 QT 버전을 사용한 코드인 것 같다. QAudioFormat 클래스의 함수 몇개가 오류가 난다.  첨부되어 있는 소스파일은 수정된 버전이다.

이렇게 바꿔 주면 된다.


이제 컴파일 될 것이며 실행도 될 것이다.


Posted by 생짜
|

코딩을 하다보면 F9를 눌러 브레이크 포인트를 사용하여 디버깅을 하기도 하지만 프로그램에서 찍는 로그파일로 디버깅을 많이 한다.


이때 대부분 IDE의 기본 log view에 의존한다.

하지만 때때로 IDE에서 나오는 log를 다른 terminal로 프린트하게 하면 더 효율 적일 때도 있다.

내가 사용하고 있는 QT Creator의 버전은 아래와 같다.





왼쪽 툴바에서 'Projects'를 선택 -> 'Build & Run'에서 'Run'을 선택 -> IDE 툴 중앙의 'Run' 부분에서 'Run In terminal' 체크 박스를 체크한다.

이러면 App을 실행 시킬때 로그 메시지가 terminal에서 보여진다.




'Run In terminal'을 체크 했더니 터미널도 실행 되지 않고 App도 실행되지 않을 때는 아래와 같이 수정하면 된다.

파일 메뉴에서 'Tool -> Options' 을 선택 후.

1: Environment 선택

2: System 선택

3: Terminal 리스트 박스에

4: 리스트중 하나를 선택하면 된다.( 기본적으로 'x-terminal-emulator -e' 으로 되어 있고 '/usr/bin/xterm -e' 으로 바꾸면 된다. 만약 그래도 안되면 자기자신한테 맞는 옵션을 선택하면 된다.)





Posted by 생짜
|

일하다 보니 QString과 QStringList를 Empty로 초기화할 필요가 생겼다.

NULL 초기화가 아니라 Empty 초기화다.

방법은 생각 외로 아주 간단하다.

QString strTmp = QString();

QStringList strTmpList = QStringList();


아주 간단하다.

Posted by 생짜
|

QString time_format = "yyyy-MM-dd  HH:mm:ss";

QDateTime a = QDateTime::currentDateTime();

QString as = a.toString(time_format);


qDebug() << as; // print "2014-07-16  17:47:04"


QTime curTime = QTime::currentTime();

QString str = curTime.toString("hh:mmAP");

qDebug() << str; // print "07:30PM"




Posted by 생짜
|

QT 뿐만 아니라 다른 플랫폼에서도 string 관련 클래스와 char 자료형 변환은 매번 하면서도 매번 잊어 먹는다. 잊어 먹을 때마다 매번 검색하기 귀찮아 정리한다.


1. QString to char 배열

QString k = "CRAZYYYQT";

char ab[16];

sprintf(ab,"%s",(const char *)((QByteArray)(k.toLatin1()).data()) );

sprintf(ab,"%s",(const char *)((QByteArray)(k.toStdString()).data()));  

sprintf(ab,"%s",(const char *)k.toStdString().c_str()  );


또는 strcpy 함수를 사용하여


 strcpy( ab, k.toStdString().c_str()); 


toLatin1() 함수의 리턴 type이 QByteArray 객체이다.


2. QString to char 포인터

char 포인터를 사용할 때 주의할 점은 const type 으로 지정해줘야 한다.

QString k = "CRAZYYYQT";

const char* p = k.toStdString().c_str();


3. char 포인터 to QString

char* cha = "ABC";

QString str = QString(ch);

QString str2 = QString("%1").arg(ch);

QString str3 = QString::fromUtf8(ch); 



'karma( 업 ) > QT&QML Tip' 카테고리의 다른 글

QString & QStringList Empty 초기화  (0) 2018.06.26
QDateTime & QDate & QTime toString 함수 사용  (0) 2018.06.12
QT Creator에서 external library 추가하기  (0) 2017.12.15
Circle Button 만들기  (0) 2017.10.23
A Tour of Qt  (0) 2017.07.04
Posted by 생짜
|

QT 프로젝트에 외부 lib를 추가시키는 방법으로는 두 가지 방법이 있다.

.pro 파일을 직접 수정하는 방법과 QT Creator의 툴을 사용하는 방법이다.


1. .pro 파일 수정

LIBS += -Lpath -llibname(*.a, *.so)

ex)) 

      LIBS += -L$$PWD/../app_build/x86_64/ -ltest

INCLUDEPATH += $$PWD/../app_build/x86_64

DEPENDPATH += $$PWD/../app_build/x86_64

'$$PWD' 키워드는 사용하는 .pro 파일의 위치이다. 여기서 의미는 현재 위치 기준이라는 뜻이다.

'path'는 test lib 파일의 경로이고  -L 키워드는 lib 의 경로의미이다.

'libname'은 lib 파일명인 test이다. ( 컴파일 후 실제 결과 파일의 파일명은 'libtest.a' 또는 'libtest.so')

INCLUDEPATH / DEPENDPATH 도 꼭 기술해줘야 한다.


2. QT Creator 사용

2.1 .pro 파일을 연다.

2.2 .pro 파일에서 마우스 오른쪽 버튼을 클릭, 팝업창에서 'Add Library...' 선택 후 위저드를 따라한다.

ex. 1


ex.2


ex.3


Library file / Include path를 선택하고( Library file을 선택하면 밑의 path는 자동으로 선택되어진다. 자동으로 선택이 안되면 Browse 버튼을 클릭하여 Library file과 동일한 path를 준다.) 사용할 해당 플랫폼을 선택한 후 Next 버튼을 클릭하면 Summary 창으로 이동한다 

Summary 창에서 Finish 버튼을 클릭하면 .pro 파일에 라이브러리가 추가된다.

'karma( 업 ) > QT&QML Tip' 카테고리의 다른 글

QDateTime & QDate & QTime toString 함수 사용  (0) 2018.06.12
QString to char* || char* to QString  (0) 2018.01.10
Circle Button 만들기  (0) 2017.10.23
A Tour of Qt  (0) 2017.07.04
QT를 시작합니다. 네번째 이야기  (0) 2017.06.22
Posted by 생짜
|

circleButton.tar.gz

원형 버튼을 만들 경우 가장 신경쓰이는게 MouseArea이다.

Rectangle에 property인 radius에 적당한 값을 주면 Rectangle의 각 모서리는 원형을 띄게 된다.

radius 값의 조절로 원형 버튼을 만들 수 있다.


이 때 중요한 것은 MouseArea 로 부모 Ractanlge에 anchors fill을 조면 원형 밖의 영역도 마우스 이벤트를 가지게 된다.


첨부되어 있는 소스를 다운받아 실행 시키면 원형의 영역에만 마우스 이벤트를 줄 수 있다.

import QtQuick 2.0


Item {

    id: roundMouseArea


    property alias mouseX: mouseArea.mouseX

    property alias mouseY: mouseArea.mouseY


    property bool containsMouse: {

        var x1 = width / 2;

        var y1 = height / 2;

        var x2 = mouseX;

        var y2 = mouseY;

        var distanceFromCenter = Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2);

        var radiusSquared = Math.pow(Math.min(width, height) / 2, 2);

        var isWithinOurRadius = distanceFromCenter < radiusSquared;

        return isWithinOurRadius;

    }


    readonly property bool pressed: containsMouse && mouseArea.pressed


    signal clicked


    MouseArea {

        id: mouseArea

        anchors.fill: parent

        hoverEnabled: true

        acceptedButtons: Qt.LeftButton | Qt.RightButton

        onClicked: if (roundMouseArea.containsMouse) roundMouseArea.clicked()

    }

}


 import QtQuick 2.6

import QtQuick.Window 2.2


Window {

    visible: true

    width: 640; height: 480;

   title: qsTr("Hello World")

   MainForm {

        anchors.fill: parent

        mouseArea.onClicked: {

            console.log(qsTr('Clicked on background. Text: "' + textEdit.text + '"'))

        }

    }


    Rectangle {

        id: circleBt

        x: 50; y:50; width: 100; height: 100

        color: roundMouseArea.pressed ?

                  "red" : (roundMouseArea.containsMouse ? "darkorange" : "transparent")

        radius: width/2

        border.color: "darkorange"


        RoundMouseArea {

            id: roundMouseArea

            anchors.fill: parent

            onClicked: print("clicked")

        }

    }

}

출처 stack overflow( https://stackoverflow.com/questions/38164074/how-to-create-a-round-mouse-area-in-qml )



Posted by 생짜
|
QT에 대한 전반적인 여행을 떠나보자 ^^




'karma( 업 ) > QT&QML Tip' 카테고리의 다른 글

QT Creator에서 external library 추가하기  (0) 2017.12.15
Circle Button 만들기  (0) 2017.10.23
QT를 시작합니다. 네번째 이야기  (0) 2017.06.22
Wrapping C++ Objects For Property Exposure In QML  (0) 2017.06.19
Qt Careers  (0) 2017.06.19
Posted by 생짜
|

'karma( 업 ) > QT&QML Tip' 카테고리의 다른 글

Circle Button 만들기  (0) 2017.10.23
A Tour of Qt  (0) 2017.07.04
Wrapping C++ Objects For Property Exposure In QML  (0) 2017.06.19
Qt Careers  (0) 2017.06.19
Qt Korea - QtOcube 포럼  (0) 2017.06.15
Posted by 생짜
|