Git을 사용하다보면 수정한 내용을 되돌리고 싶을 경우가 간혹있다. GUI가 있는 Git 클라이언트의 경우엔 discard를 하면 되지만 command line interface에서는 어떻게 해야 할지 잘 모를때가 많다. 각 상황별로 수정 내역을 되돌리는 법을 알아보자.

1. git add 명령을 하기 이전(stage에 올리지 않은 경우)

1.1 repository 내 모든 수정 되돌리기

$ cd {repository_root_dir}
$ git checkout .

1.2 특정 폴더 아래의 모든 수정 되돌리기

$ git checkout {dir}

1.3 특정 파일의 수정 되돌리기

$ git checkout {file_name}

2. git add 명령으로 stage에 올린 경우

$ git reset

3. git commit을 한 경우

3.1 commit 내용을 없애고 이전 상태로 원복

master 브랜치의 마지막 커밋을 가리키던 HEAD를 그 이전으로 이동시켜서 commit 내용을 없앰

$ git reset --hard HEAD^

3.2 commit은 취소하고 commit 했던 내용은 남기고 unstaged 상태로 만들기

$ git reset HEAD^

3.3 commit은 취소하고 commit 했던 내용은 남기고 staged 상태로 만들기

$ git reset --soft HEAD^

4. 모든 untracked 파일들을 지우기

git clean -fdx

5. git push를 한 경우 remote repository도 이전으로 되돌리기

$ git reset HEAD^  #local repository에서 commit을 하나 되돌림
$ git commit -m "..."  #되돌린 것으로 commit
$ git push origin +master #remote repository를 강제로 revert


'GitLab' 카테고리의 다른 글

GitLab 공개키 등록하기  (0) 2017.11.02
SVN 저장소를 Git으로 옮기는 방법  (0) 2017.11.02
Git Bash로 SSH 공개키 발급하기  (0) 2017.11.02
Git 최초 설정  (0) 2017.11.02
git 초기 환경설정  (0) 2017.10.17
Posted by 모래반지빵냐빵냐
,
connect( &renderTimer, &QTimer::timeout, [=](){onTimerUpdate();} );


Posted by 모래반지빵냐빵냐
,

이 문서는 GitLab에서 발급받은 SSH 공개키를 등록하는 절차에 대해서 가이드합니다. 물론 GitLab은 HTTP를 통한 Clone을 제공하고 있지만, 지속적인 로그인이 귀찮으신 분들은 SSH 공개키 등록을 통해 이를 방지할 수 있습니다.


SSH 공개키 발급은 다음 문서를 통해 확인하시기 바랍니다. 



SSH 공개키와 개인키가 준비되었다면, 아래를 읽어보시고 GitLab 자신의 계정에 등록하시기 바랍니다. 


먼저 GitLab으로 로그인을 수행합니다. 

프로젝트 화면이 나오는데 좌측 메뉴의 아랫부분의 Profile Setting 메뉴를 클릭합니다. 


gitlab01.png


Profile Setting화면이 나타나면, 아래 그림처럼 좌측의 SSH Keys 버튼을 클릭하고 ADD SSH KEY 버튼을 클릭해줍니다. 


gitlab02.png


이제 Add an SSH Key 화면이 나타나면, Key Text Area 영역에 발급받은 SSH 공개키를 입력합니다. 이때 주의할 점은 키는 엔터없이 한줄로 붙어있어야 합니다. 붙여넣기가 완료되었으면, Title을 입력하고 ADD KEY 버튼을 클릭합니다. 


gitlab03.png


이렇게 작업 PC에 따라 SSH를 발급하고 여기에서 추가합니다. 


http://pseg.or.kr/pseg/?mid=infouse&search_target=tag&search_keyword=SSH&document_srl=5966

'GitLab' 카테고리의 다른 글

Git - 수정한 것 되돌리기  (0) 2018.01.26
SVN 저장소를 Git으로 옮기는 방법  (0) 2017.11.02
Git Bash로 SSH 공개키 발급하기  (0) 2017.11.02
Git 최초 설정  (0) 2017.11.02
git 초기 환경설정  (0) 2017.10.17
Posted by 모래반지빵냐빵냐
,

기존 Subversion으로 관리하던 소스코드를 Git으로 관리하는 것이 대세이다. 이 게시물은 svn으로 관리하던 소스코드를 Git으로 옮기는 방법을 정리 한다.

02-2.svg 

사전 준비:

- Subversion client 설치

- Git 설치

- SVN 사용자 목록 파일 생성 (예: authors.txt)

  Terry Hwang<terry.hwang@curvc.com> 

          .

          .

          .

Step 1) SVN 저장소 클론

SVN repository가  /trunk, /branches, /tags 로만 구성되었을 경우:

1
git svn clone --stdlayout --authors-file=authors.txt  <svn-repo>/<project> <git-repo-name>


예)

1
git svn clone --stdlayout --authors-file=authors.txt https://svn.atlassian.com/Confluence ConfluenceAsGit


SVN repository가  특별한 branch로 구성되었을 경우:

1
git svn clone --trunk=/trunk --branches=/branches --branches=/bugfixes --authors-file=authors.txt  <svn-repo>/<project> <git-repo-name>


예)

1
git svn clone --trunk=/trunk --branches=/branches --branches=/bugfixes --authors-file=authors.txt https://svn.atlassian.com/Confluence ConfluenceAsGit


참고 사이트 = https://www.atlassian.com/git/tutorials/migrating-convert

'GitLab' 카테고리의 다른 글

Git - 수정한 것 되돌리기  (0) 2018.01.26
GitLab 공개키 등록하기  (0) 2017.11.02
Git Bash로 SSH 공개키 발급하기  (0) 2017.11.02
Git 최초 설정  (0) 2017.11.02
git 초기 환경설정  (0) 2017.10.17
Posted by 모래반지빵냐빵냐
,

Git 서버는 SSH 공개키로 인증을 합니다. 이러한 SSH를 발급하는 방식은 다양한데, 이 문서에서는 Git Bash를 이용하여 공개키를 발급하는 방법에 대해 설명합니다. 


먼저 Git Bash를 실행합니다. 저는 Win8.1을 사용하고 있어, 앱에서 Git을 검색하였습니다.  Win7이하는 프로그램 파일에서 Git Bash를 선택합니다. 


git01.png


Git Bash화면이 아래와 같이 나타납니다.


git02.png


먼저 ssh-kegen 명령을 통해 Public 키와 Private 키 한쌍을 생성합니다.


1
$ ssh-keygen


상위 명령어를 수행하면, 처음 저장할 위치를 묻습니다. Enter를 치면 .ssh에 저장됩니다. 

다음은 Password(passphrase) 이때 패스워드를 입력하지 않으면, Git 서버에 Push할때, 패스워드를 묻지 않습니다. 

그럼 아래 그림과 같이 SSH 키가 생성됩니다.


git03.png


아래와 같이 해당 위치에 Public 키와 Private 키가 생성되었는지 확인합니다. 


git04.png


생성이 확인되었다면, cat 명령을 통해 공개키 내용을 확인하고 해당 키를 Git Server 관리자에게 알려줍니다. 

혹은 사용하고있는 Gerrit 혹은 Gitlab에 등록합니다. 


1
$ cat id_rsa.pub



git05.png


이상으로 Git Bash를 통해 SSH Public 키와 Private 키를 생성하는 방법을 알아보았습니다.


http://pseg.or.kr/pseg/infouse/5955

'GitLab' 카테고리의 다른 글

GitLab 공개키 등록하기  (0) 2017.11.02
SVN 저장소를 Git으로 옮기는 방법  (0) 2017.11.02
Git 최초 설정  (0) 2017.11.02
git 초기 환경설정  (0) 2017.10.17
git 관련 한글레퍼런스  (0) 2017.10.17
Posted by 모래반지빵냐빵냐
,

Git 최초 설정

GitLab 2017. 11. 2. 15:10

Git 최초 설정

Git을 설치하고 나면 Git의 사용 환경을 적절하게 설정해 주어야 한다. 한 번만 설정하면 된다. 설정한 내용은 Git을 업그레이드해도 유지된다. 언제든지 다시 바꿀 수 있는 명령어가 있다.

'git config'라는 도구로 설정 내용을 확인하고 변경할 수 있다. Git은 이 설정에 따라 동작한다. 이때 사용하는 설정 파일은 세 가지나 된다.

  • /etc/gitconfig 파일: 시스템의 모든 사용자와 모든 저장소에 적용되는 설정이다. git config --system 옵션으로 이 파일을 읽고 쓸 수 있다.
  • ~/.gitconfig 파일: 특정 사용자에게만 적용되는 설정이다. git config --global 옵션으로 이 파일을 읽고 쓸 수 있다.
  • .git/config: 이 파일은 Git 디렉토리에 있고 특정 저장소(혹은 현재 작업 중인 프로젝트)에만 적용된다. 각 설정은 역순으로 우선시 된다. 그래서 .git/config가 /etc/gitconfig보다 우선한다.

윈도용 Git은 $HOME 디렉토리(%USERPROFILE% 환경변수)에 있는 .gitconfig 파일을 찾는다. 보통 C:\Documents and Settings\$USER 또는 C:\Users\$USER 이다(윈도우에서는 $USER 대신 %USERNAME%를 사용한다). 그리고 msysGit도 /etc/gitconfig를 가지고 있다. 경로는 MSys 루트에 따른 상대 경로다. 인스톨러로 msysGit을 설치할 때 설치 경로를 선택할 수 있다.

사용자 정보

Git을 설치하고 나서 가장 먼저 해야 하는 것은 사용자 이름과 이메일 주소를 설정하는 것이다. Git은 커밋할 때마다 이 정보를 사용한다. 한 번 커밋한 후에는 정보를 변경할 수 없다:

$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com

다시 말하자면 --global 옵션으로 설정한 것은 딱 한 번만 하면 된다. 해당 시스템에서 해당 사용자가 사용할 때에는 이 정보를 사용한다. 만약 프로젝트마다 다른 이름과 이메일 주소를 사용하고 싶으면 --global 옵션을 빼고 명령을 실행한다.

편집기

사용자 정보를 설정하고 나면 Git에서 사용할 텍스트 편집기를 고른다. 기본적으로 Git은 시스템의 기본 편집기를 사용하고 보통 Vi나 Vim이다. 하지만, Emacs 같은 다른 텍스트 편집기를 사용할 수 있고 아래와 같이 실행하면 된다:

$ git config --global core.editor emacs

Diff 도구

Merge 충돌을 해결하기 위해 사용하는 Diff 도구를 설정할 수 있다. vimdiff를 사용하고 싶으면 아래와 같이 실행한다:

$ git config --global merge.tool vimdiff

이렇게 kdiff3, tkdiff, meld, xxdif, emerge, vimdiff, gvimdiff, ecmerge, opendiff를 사용할 수 있다. 물론 다른 도구도 사용할 수 있다. 자세한 내용은 7장에서 다룬다.

설정 확인

git config --list 명령을 실행하면 설정한 모든 것을 보여준다:

$ git config --list
user.name=Scott Chacon
user.email=schacon@gmail.com
color.status=auto
color.branch=auto
color.interactive=auto
color.diff=auto
...

Git은 같은 키를 여러 파일(/etc/gitconfig와 ~/.gitconfig 같은)에서 읽기 때문에 같은 키가 여러개 있을 수도 있다. 이러면 Git은 나중 값을 사용한다.

git config {key} 명령으로 Git이 특정 Key에 대해 어떤 값을 사용하는지 확인할 수 있다:

$ git config user.name
Scott Chacon


https://git-scm.com/book/ko/v1/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-Git-%EC%B5%9C%EC%B4%88-%EC%84%A4%EC%A0%95

'GitLab' 카테고리의 다른 글

SVN 저장소를 Git으로 옮기는 방법  (0) 2017.11.02
Git Bash로 SSH 공개키 발급하기  (0) 2017.11.02
git 초기 환경설정  (0) 2017.10.17
git 관련 한글레퍼런스  (0) 2017.10.17
Failed Attempts to Delete Remote Branch  (0) 2017.09.21
Posted by 모래반지빵냐빵냐
,

git 초기 환경설정

GitLab 2017. 10. 17. 10:28

- Git 환경 설정하기

git config --global user.email "이메일주소"
git config --global user.name "이름"

git remote -v

push origin 경로 확인


origin 삭제

git remote rm origin 

2.1 Git의 기초 - Git 저장소 만들기

Git 저장소 만들기

Git 저장소를 만드는 방법은 두 가지다. 기존 프로젝트를 Git 저장소로 만드는 방법이 있고 다른 서버에 있는 저장소를 Clone하는 방법이 있다.

기존 디렉토리를 Git 저장소로 만들기

기존 프로젝트를 Git으로 관리하고 싶을 때, 프로젝트의 디렉토리로 이동해서 아래과 같은 명령을 실행한다.

$ git init

이 명령은 .git이라는 하위 디렉토리를 만든다. .git 디렉토리에는 저장소에 필요한 뼈대 파일(Skeleton)이 들어 있다(.git 디렉토리가 막 만들어진 직후에 어떤 파일이 있는지에 대한 내용은 9장에서 다룬다). 이 명령만으로는 아직 프로젝트의 어떤 파일도 관리하지 않는다.

Git이 파일을 관리하게 하려면 저장소에 파일을 추가하고 커밋해야 한다. git add 명령으로 파일을 추가하고 커밋한다:

$ git add *.c
$ git add README
$ git commit -m 'initial project version'

매우 짧은 시간에 명령어를 몇개 실행해서 Git 저장소를 만들고 파일이 관리되게 했다.

기존 저장소를 Clone하기

다른 프로젝트에 참여하거나(Contribute) Git 저장소를 복사하고 싶을 때 git clone 명령을 사용한다. 이미 Subversion 같은 VCS에 익숙한 사용자에게는 checkout이 아니라 clone이라는 점이 도드라져 보일 것이다. Git이 Subversion과 다른 가장 큰 차이점은 서버에 있는 모든 데이터를 복사한다는 것이다. git clone을 실행하면 프로젝트 히스토리를 전부 받아온다. 실제로 서버의 디스크가 망가져도 클라이언트 저장소 중에서 아무거나 하나 가져다가 복구하면 된다(서버에만 적용했던 설정은 복구하지 못하지만 모든 데이터는 복구된다 - 4장에서 좀 더 자세히 다룬다).

git clone [url] 명령으로 저장소를 Clone한다. Ruby용 Git 라이브러리인 Grit을 Clone하려면 아래과 같이 실행한다:

$ git clone git://github.com/schacon/grit.git

이 명령은 "grit"이라는 디렉토리를 만들고 그 안에 .git 디렉토리를 만든다. 그리고 저장소의 데이터를 모두 가져와서 자동으로 가장 최신 버전을 Checkout해 놓는다. grit 디렉토리로 이동하면 Checkout으로 생성한 파일을 볼 수 있고 당장 하고자 하는 일을 시작할 수 있다. 아래과 같은 명령을 사용하여 저장소를 Clone하면 "grit"이 아니라 다른 디렉토리 이름으로 Clone할 수 있다:

$ git clone git://github.com/schacon/grit.git mygrit

디렉토리 이름이 mygrit이라는 것만 빼면 이 명령의 결과와 앞선 명령의 결과는 같다.

Git은 다양한 프로토콜을 지원한다. 이제까지는 git:// 프로토콜을 사용했지만 http(s)://를 사용할 수도 있고 user@server:/path.git처럼 SSH 프로토콜을 사용할 수도 있다. 자세한 내용은 4장에서 다룬다. 4장에서는 각 프로토콜의 장단점과 Git 저장소에 접근하는 방법을 설명한다.

출처: http://newsight.tistory.com/25 [New Sight]

https://git-scm.com/book/ko/v1/Git%EC%9D%98-%EA%B8%B0%EC%B4%88-Git-%EC%A0%80%EC%9E%A5%EC%86%8C-%EB%A7%8C%EB%93%A4%EA%B8%B0

'GitLab' 카테고리의 다른 글

SVN 저장소를 Git으로 옮기는 방법  (0) 2017.11.02
Git Bash로 SSH 공개키 발급하기  (0) 2017.11.02
Git 최초 설정  (0) 2017.11.02
git 관련 한글레퍼런스  (0) 2017.10.17
Failed Attempts to Delete Remote Branch  (0) 2017.09.21
Posted by 모래반지빵냐빵냐
,

꼭 읽어볼것


https://git-scm.com/book/ko/v2/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-%EB%B2%84%EC%A0%84-%EA%B4%80%EB%A6%AC%EB%9E%80%3F

'GitLab' 카테고리의 다른 글

SVN 저장소를 Git으로 옮기는 방법  (0) 2017.11.02
Git Bash로 SSH 공개키 발급하기  (0) 2017.11.02
Git 최초 설정  (0) 2017.11.02
git 초기 환경설정  (0) 2017.10.17
Failed Attempts to Delete Remote Branch  (0) 2017.09.21
Posted by 모래반지빵냐빵냐
,

https://stackoverflow.com/questions/24075311/build-with-f7-shortcut-not-available-vs-2012


위에 나온거처럼 


ctrl + Shift + B (buildsolution) 키를  F7로바꿔주면 기존처럼 쓸수있다

Posted by 모래반지빵냐빵냐
,

Visual stuio bookmark

Tip 2017. 9. 29. 16:16


책갈피 지정/해제는 원하는 라인에서 Ctrl+F2

책갈피간 이동은 F2

책갈피 전체 삭제는 Ctrl+Shift+F2

'Tip' 카테고리의 다른 글

vs 창을 반반씩 나눠서 코딩  (0) 2017.09.25
Posted by 모래반지빵냐빵냐
,


Alt + W, N
Alt + W, V


'Tip' 카테고리의 다른 글

Visual stuio bookmark  (0) 2017.09.29
Posted by 모래반지빵냐빵냐
,

https://stackoverflow.com/questions/2003505/how-do-i-delete-a-git-branch-both-locally-and-remotely


$ git branch -d remotes/origin/bugfix
error: branch 'remotes/origin/bugfix' not found.

$ git branch -d origin/bugfix
error: branch 'origin/bugfix' not found.

$ git branch -rd origin/bugfix
Deleted remote branch origin/bugfix (was 2a14ef7).

$ git push
Everything up-to-date

$ git pull
From github.com:gituser/gitproject
* [new branch] bugfix -> origin/bugfix
Already up-to-date.


Executive Summary

$ git push -d origin <branch_name>
$ git branch -d <branch_name>

Delete Local Branch

To delete the local branch use one of the following:

$ git branch -d branch_name
$ git branch -D branch_name

Note: The -d option is an alias for --delete, which only deletes the branch if it has already been fully merged in its upstream branch. You could also use -D, which is an alias for --delete --force, which deletes the branch "irrespective of its merged status." [Source: man git-branch]

Delete Remote Branch [Updated on 8-Sep-2017]

As of Git v1.7.0, you can delete a remote branch using

$ git push origin --delete <branch_name>

which might be easier to remember than

$ git push origin :<branch_name>

which was added in Git v1.5.0 "to delete a remote branch or a tag."

Starting on Git v2.8.0 you can also use git push with the -d option as an alias for --delete.

Therefore, the version of Git you have installed will dictate whether you need to use the easier or harder syntax.

Delete Remote Branch [Original Answer from 5-Jan-2010]

From Chapter 3 of Pro Git by Scott Chacon:

Deleting Remote Branches

Suppose you’re done with a remote branch — say, you and your collaborators are finished with a feature and have merged it into your remote’s master branch (or whatever branch your stable codeline is in). You can delete a remote branch using the rather obtuse syntax git push [remotename] :[branch]. If you want to delete your serverfix branch from the server, you run the following:

$ git push origin :serverfix
To git@github.com:schacon/simplegit.git
 - [deleted]         serverfix

Boom. No more branch on your server. You may want to dog-ear this page, because you’ll need that command, and you’ll likely forget the syntax. A way to remember this command is by recalling the git push [remotename] [localbranch]:[remotebranch] syntax that we went over a bit earlier. If you leave off the [localbranch] portion, then you’re basically saying, “Take nothing on my side and make it be [remotebranch].”

I issued git push origin :bugfix and it worked beautifully. Scott Chacon was right—I will want to dog ear that page (or virtually dog ear by answering this on Stack Overflow).

Then you should execute this on other machines

git fetch --all --prune

to propagate changes.



'GitLab' 카테고리의 다른 글

SVN 저장소를 Git으로 옮기는 방법  (0) 2017.11.02
Git Bash로 SSH 공개키 발급하기  (0) 2017.11.02
Git 최초 설정  (0) 2017.11.02
git 초기 환경설정  (0) 2017.10.17
git 관련 한글레퍼런스  (0) 2017.10.17
Posted by 모래반지빵냐빵냐
,

Qt를 이용하여 실행파일을 만들었다면 이제 배포를 해야 하는 데 shared library를 사용하여 개발을 했다면 관련 dll을 함께 배포하여야 한다.


상용버전을 구매하였다면 static build 해서 이런 문제를 간단히 해결하겠지만 그렇지 않다면 다음 내용을 참고 해 보자.




Dependency Walker를 이용하면 이 프로그램이 의존하는 dll들의 목록을 살펴볼 수 있다.

dll 트리구조에서 빨간 아이콘은 시스템 dll이기 때문에 패스하고 회색의 dll 들을 Qt dll이 들어있는 폴더에서 찾아

(본인의 경우 C:\Qt\Qt5.4.1\5.4\mingw491_32\) 해당 dll들을 복사해 온다.


근데 이렇게 해도 실행이 안되는 데 플랫폼 플러그인인 qwindows.dll 을 찾기 때문이다.


이 dll은 특이하게 실행파일과 같은 경로에 복사해도 오류를 발생시키는 데 이유는 platforms 폴더를 만들어서 넣어놔야 하기 때문이다. 아마도 실행 시 기본으로 이 폴더를 찾는 듯 하다. (소스를 수정하면 찾는 폴더를 바꿀 수 있을지도...)


참고로 core, gui 를 사용하는 Qt 프로그램을 MinGW(MSVC용이 아님) release로 빌드했을 때 필요한 dll들은 다음과 같다.

Qt5Core.dll

Qt5Gui.dll

Qt5Widgets.dll

icudt53.dll

icuin53.dll

icuuc53.dll

libgcc_s_dw2-1.dll

libstdc++-6.dll

libwinpthread-1.dll

platforms/qwindows.dll


마지막으로 위 과정을 한방에 자동으로 해주는 프로그램이 준비되어 있는데 windeployqt.exe란 프로그램이다.


지금 사용하는 컴퓨터의 환경이 꼬여서 windeployqt를 쓸 수 없어 수동으로 배포파일들을 구성했는데 고생하지 말고 위 프로그램을 쓰도록 하자. ^^


정적빌드하시는 분들에겐 필요가 없을 수도 있습니다만..
Qt를 설치하면 빌드에 관련된 툴이 있는 bin디렉토리가 있습니다. 이 안에 보면 windeployqt.exe가 있습니다. 
(예를들어 Qt.5.3.1 MinGW버전같은경우 C:/Qt/5.3/mingw482_32/bin)
이것은 작업한 실행화일의 디펜던시를 체크해서 필요한 화일들을 쉽게 복사해주는 프로그램인데요..
사용하는 법을 간단히 설명드리자면,
디렉토리를 생성해서 작업한 실행화일을 그곳에 복사한 후.. 대충 c:\qtdeploy\myapp.exe 이렇게 위치시켜보죠
Qt설치시 '시작'메뉴에 생성 되어있는 명령행프롬프트(반드시!)를 실행시킨 후
'c:\qtdeploy>c:\qt\5.3\mingw482_32\bin\windeployqt.exe myapp.exe' 해주면
myapp.exe에 필요한 모든 화일들이 c:\qtdeploy 디렉토리 안에 복사됩니다.
제가 아직은 NSIS에만 익숙한고로 이 방법이 상당히 편하네요 ^^

Posted by 모래반지빵냐빵냐
,

5. QFile

QT/Tutorials 2015. 4. 16. 13:46
QFile은 파일을 읽고 쓰는 인터페이스를 제공해준다. 

바이너리 파일이나 텍스트 파일을 읽고쓰게 해주며 QTextStream 이나 QDataStream과 사용되기도한다.


파일이름을 생성자에 넣어서 생성하기도하고 setFileName()을 써서 언제든지 파일이름을 지정해줄수도 있다.


'/' 이기호로 파일을 분류한다 .\<- 요거 아님


exists()로 파일이 인스턴스안에 존재하는지 체크 할수 있고 remove()로 지울수 있음


QtextStream은 8-bit 데이터를 16-bit Unicode QString으로 변환하는 역활을 한다.


QTextstream에 파일을 쓰기 위해선 <<() operator를 사용하면 된다.

요렇게 실행하면 "QFile Tutorial" 이라고 뜬단다. 아직안해봄




'QT > Tutorials' 카테고리의 다른 글

MainWindow and ImageViewer using Creator - Part A  (0) 2015.04.15
4. Main Window and Action  (0) 2015.04.14
3. Q_OBJECT Macro  (0) 2015.04.14
2. Signals and Slots  (0) 2015.04.14
1. HelloWorld  (0) 2015.04.14
Posted by 모래반지빵냐빵냐
,

QT) QMessageBox

QT/Basics 2015. 4. 15. 13:26

QT에서 MessageBox를 구현하려면 다음과 같은 방법을 사용하여야 한다.

#include <QMessageBox>

QMessageBox::warning(this, tr("Title"), tr("Message"), Buttons);

QMessageBox::question(this, tr("Title"), tr("Message"), Buttons);

QMessageBox::information(this, tr("Title"), tr("Message"), Buttons);

QMessageBox::critical(this, tr("Title"), tr("Message"), Buttons);

각각의 항목에 따른 아이콘들이 출력 되게 되어 있다. 

또한, Button은 다음과 같이 구성되어 있다.

QMessageBox::Ok   [OK 버튼]

QMessageBox::Cancel   [Cancel 버튼]   값 : 2

QMessageBox::Yes   [Yes 버튼]    값 : 3

QMessageBox::No   [No 버튼]    값 : 4

QMessageBox::Abort   [Abort 버튼]   값 : 5

QMessageBox::Retry   [Retry 버튼]   값 : 6

QMessageBox::Ignore   [Ignore 버튼]   값 : 7

QMessageBox::YesAll   [Yes to All 버튼]   값 : 8

QMessageBox::NoAll   [No to All 버튼]   값 : 9




Posted by 모래반지빵냐빵냐
,

출처 : http://god10276.tistory.com/entry/QT%EB%A1%9C-Serial-%ED%86%B5%EC%8B%A0-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0-1


QT로 Serial 통신을 구현하려고 한다.

앞서 기본적으로 QT Creator 를 이용하여 Form을 생성하는 방법과 Button Event 등 Event 함수 등을 설정하는 방법 등에 대해서 기술하였다. 이번에는 실제 Serial 통신은 어떤 식으로 구현하는지 알아보자.

먼저 Window와 다르게 Linux는 /dev/ttyS0 -> COM1 , /dev/ttyS1 -> COM2 .... 이런 식으로 구성되고, USB to Serial 같은 경우에는 /dev/ttyUSB0 이런식으로 구분되기 때문에 따로따로 기술해 주어야 한다. 그래서 다음과 같이 정의했다.



#define DEVICE01 "/dev/ttyS0"
#define DEVICE02 "/dev/ttyS1"
#define DEVICE03 "/dev/ttyS2"
#define DEVICE04 "/dev/ttyUSB0"
#define DEVICE05 "/dev/ttyUSB1"



이런 식으로 정의하여서 사용자가 선택한 Device 장비로 Setting 될 수 있도록 하였다.

또한, BAUDRATE 같은 경우에는 <asm/termbits.h>에 정의되어 있는데 이것은 <termios.h>에 include 된다. 그러므로, <termios.h> Header File 만 Include 해 주면 된다. 

역시 편리하게 하기 위해 다음과 같은 방법으로 정의해 두었다.

#define BAUDRATE1200     B1200
#define BAUDRATE2400     B2400
#define BAUDRATE4800     B4800
#define BAUDRATE9600     B9600
#define BAUDRATE14400    B14400
#define BAUDRATE19200    B19200
#define BAUDRATE38400    B38400
#define BAUDRATE56000    B56000
#define BAUDRATE57600    B57600
#define BAUDRATE115200   B115200

기본적으로 Serial 통신을 위해 추가해 준 Header File은 다음과 같다.

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>



이제 본격적인 UI 구성으로 들어가 보자.





그냥 단순하게, Terminal 창 만을 나타낼 수 있도록 구성하였다. 앞부분에서 COM Port를 설정하고 뒷 부분에서 BAUDRATE를 설정한 후에 Connect를 하면 정상적으로 Board와 통신할 수 있게 된다. 해당 UI를 포함한 클래스의 Private member로 다음과 같은 항목들을 추가해 주었다.

    QSocketNotifier *notRsRead;
    int fd;
    char buf[BUFF_SIZE];


QSocketNotifier는 <QSocketNotifier>라는 Header를 추가해 주어야 한다. 이것에 대한 자세한 설명은 추후에 기술하도록 하겠다.

또한, QSocketNotifier에 의해 동작될 Event 함수도 public slots에 정의해 주었다. 

public slots:
    void setEvent();

// pushButton 사용자 정의 함수
private slots:
       void on_connectButton_clicked();

void MainWindow::on_connectButton_clicked()
{
    /*
        #define DEVICE01 "/dev/ttyS0"
        #define DEVICE02 "/dev/ttyS1"
        #define DEVICE03 "/dev/ttyS2"
        #define DEVICE04 "/dev/ttyUSB0"
        #define DEVICE05 "/dev/ttyUSB1"

        #define BAUDRATE1200     B1200
        #define BAUDRATE2400     B2400
        #define BAUDRATE3800     B4800
        #define BAUDRATE9600     B9600
        #define BAUDRATE14400    B14400
        #define BAUDRATE19200    B19200
        #define BAUDRATE38400    B38400
        #define BAUDRATE56000    B56000
        #define BAUDRATE57600    B57600
        #define BAUDRATE115200   B115200
    */

    struct termios newtio;
    int res;

    QString temp_port, port;
    QString temp_baudrate, baudrate;

    temp_port = ui->portBox->currentText();

    if(temp_port == "ttyS0")
    {
        fd = open(DEVICE01, O_RDWR | O_NOCTTY | O_NONBLOCK);
    }
    else if(temp_port == "ttyS1")
    {
        fd = open(DEVICE02, O_RDWR | O_NOCTTY | O_NONBLOCK);
    }
    else if(temp_port == "ttyS2")
    {
        fd = open(DEVICE03, O_RDWR | O_NOCTTY | O_NONBLOCK);
    }
    else if(temp_port == "ttyUSB0")
    {
        fd = open(DEVICE04, O_RDWR | O_NOCTTY | O_NONBLOCK);
    }
    else
    {
        fd = open(DEVICE05, O_RDWR | O_NOCTTY | O_NONBLOCK);
    }

    memset(&newtio, 0, sizeof(newtio));

    temp_baudrate = ui->baudrateBox->currentText();

    if(temp_baudrate == "1200")
        newtio.c_cflag = BAUDRATE1200;
    else if(temp_baudrate == "2400")
        newtio.c_cflag = BAUDRATE2400;
    else if(temp_baudrate == "4800")
        newtio.c_cflag = BAUDRATE4800;
    else if(temp_baudrate == "9600")
        newtio.c_cflag = BAUDRATE9600;
    else if(temp_baudrate == "19200")
        newtio.c_cflag = BAUDRATE19200;
    else if(temp_baudrate == "38400")
        newtio.c_cflag = BAUDRATE38400;
    else if(temp_baudrate == "57600")
        newtio.c_cflag = BAUDRATE57600;
    else if(temp_baudrate == "115200")
        newtio.c_cflag = BAUDRATE115200;

    newtio.c_cflag |= CS8;
    newtio.c_cflag |= CLOCAL | CREAD;
    newtio.c_iflag = IGNPAR;
    newtio.c_oflag = 0;
    newtio.c_lflag = 0;

    newtio.c_cc[VINTR]    = 0;     /* Ctrl-c */
    newtio.c_cc[VQUIT]    = 0;     /* Ctrl-\ */
    newtio.c_cc[VERASE]   = 0;     /* del */
    newtio.c_cc[VKILL]    = 0;     /* @ */
    newtio.c_cc[VEOF]     = 4;     /* Ctrl-d */
    newtio.c_cc[VTIME]    = 0;     /* inter-character timer unused */
    newtio.c_cc[VMIN]     = 1;     /* blocking read until 1 character arrives */
    newtio.c_cc[VSWTC]    = 0;     /* '\0' */
    newtio.c_cc[VSTART]   = 0;     /* Ctrl-q */
    newtio.c_cc[VSTOP]    = 0;     /* Ctrl-s */
    newtio.c_cc[VSUSP]    = 0;     /* Ctrl-z */
    newtio.c_cc[VEOL]     = 0;     /* '\0' */
    newtio.c_cc[VREPRINT] = 0;     /* Ctrl-r */
    newtio.c_cc[VDISCARD] = 0;     /* Ctrl-u */
    newtio.c_cc[VWERASE]  = 0;     /* Ctrl-w */
    newtio.c_cc[VLNEXT]   = 0;     /* Ctrl-v */
    newtio.c_cc[VEOL2]    = 0;     /* '\0' */


    tcflush(fd, TCIFLUSH);
    tcsetattr(fd, TCSANOW, &newtio);

    notRsRead = new QSocketNotifier(fd, QSocketNotifier::Read, this);
    connect(notRsRead, SIGNAL(activated(int)), this, SLOT(setEvent()));

}

void MainWindow::setEvent()
{
    int szRead;
    szRead = read(fd, buf, BUFF_SIZE);
    buf[szRead] = '\0';
    ui->textEdit->insertPlainText(buf);
    ui->textEdit->moveCursor(QTextCursor::End);
}


이게 실제 구현부이다. open을 통해 Com port를 열어 주고, BAUDRATE 설정을 통해 통신 속도를 설정해 준다. 그리고 QSocketNotifier로 Message가 오면 setEvent 함수가 동작할 수 있도록 구현하였다. 자세한 내용은 Source를 조금 읽어보면 쉽게 확인할 수 있을것이다.

여기서 중요한 부분은 

struct termios newtio;

이부분인데, 따로 정의하지 않아도 Header File안에 정의되어 있으므로 사용할 수 있다. 이 부분을 설정해주고 사용하여야 정상적인 통신이 가능하다.

'QT > Examples' 카테고리의 다른 글

Hello World를 띄우자.  (0) 2015.04.08
QT에서 이미지 출력하는 방법  (0) 2015.04.03
Qt에서 OpenCV 사용하기  (0) 2015.03.30
Posted by 모래반지빵냐빵냐
,

QT tr() 다국어 지원

QT/Basics 2015. 4. 15. 11:32

Qt는 언어를 바꾸기위해 소스코드를 바꾸지 않아도 되도록 다국어 지원을 한다.

   . Qt는 data를 다룰때 unicode string 을 사용한다. (QString QStringlist QChar)

   . Qt는 런타임에 어플리케이션 스트링을 자동적으로 읽어올 수 있는 기반시스템을 제공한다.

   . 또한 Qt Extended는 어플리케이션을 처음 시작할 때 언어 관련 파일을 자동적으로 로드한다.

 

다국어 지원을 위해서 tr() 함수를 사용한다.

   예) QString str(tr("Hello"));

   . QString tr(QString const&) 함수는 모든 클래스에 대해 moc에 의해 번역이 수행된다.

 

   . 추가적으로 comment 와 context 를 사용할 수 있다.

     ts 파일을 context(name, comment, extracomment, message) 등으로 구성되는데

     - context는 string scope 을 정의하는 기능(XML의 context로 생각하면 됨)

        생략 시 클래스 이름(Q_OBJECT 매크로가 정의된 QObject 의 class name)

        두개의 문장이나 구를 구분하는데 사용됨  

        즉, 같은 문장이라도 context가 다르면 2개를 번역을 해주어야 함.      

     - comment는 string이 뜻이 애매모호할 때 부가적인 설명을 붙이는 기능이다.

        QString str(tr("Hello", "this is comment"));

     - message가 실제 데이터 내용인데 source(원본) 과 translation으로 구성된다.

 

     .ts 파일의 내부를 보는데 위 내용을 알면 도움이 될것이다.

     ts : transltion source

     qm : qt message

 

Qt Extended 는 번역을 위해 몇가지 툴을 제공하는데 lupdate와 lrelease이다.

    lupdate : 소스로 부터 tr 함수의 string 파일로 부터 .ts 파일을 만든다.

    lrelease : 업데이트된 .ts 파일을 바이너리 파일인 .qm 파일로 만든다.

                  qm파일은 어플리케이션이 시작할 때 로딩되어 다국어를 읽을 수 있게 한다.

    Qt Linguist : .ts 파일을 그래픽 적으로 편집할 수 있게 하는 툴이다.

                     번역 상태가 Unfinished (번역안됨), Obsolete(이미 사용되어지지 않음, 회색으로 표시)

                     Finished (번역 끝남, 화면에 녹색 체크표시) 3가지 상태가 존재한다.

 

Qt Extended 는 언어 파일 추출을 위해 두가지 make target를 제공한다.

    make lupdate : 언어에 따른 ts 파일 생성

    make lrelease : ts 파일을 qm 파일로 변환 하고 i18n/<lang>/<application name>.qm 으로 qm파일을 설치

 

변수에 tr을 사용할 때 QT_TR_NOOP 또는 QT_TRANSLATE_NOOP 매크로 사용

static const char* str[] = {

   QT_TR_NOOP("String 1"),

   QT_TR_NOOP("String 2"),

   QT_TR_NOOP("String 3"),

   QT_TR_NOOP("String 4"),

}

 

QT_TRANSLATE_NOOP는

QT_TRANSLATE_NOOP("Context", "String 1")

와 같이 context를 사용할 수 있다.

 

 

TS 파일 내부 예

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS><TS version="1.1" language="ko_KR">
<defaultcodec></defaultcodec>
<context>
    <name>English (U.S.)</name>
    <message>
        <location filename="../../src/server/main/tr13494.cpp" line="2"/>
        <source>English (U.S.)</source>
        <translation></translation>
    </message>
</context>
<context>
    <name>Korean</name>
    <message>
        <location filename="../../src/server/main/tr13494.cpp" line="1"/>
        <source>Korean</source>
        <translation>?쒓뎅??/translation>
    </message>
</context>
</TS>


Posted by 모래반지빵냐빵냐
,

이번 장에선 이미지 뷰어를 만들어보겠음

'QT > Tutorials' 카테고리의 다른 글

5. QFile  (0) 2015.04.16
4. Main Window and Action  (0) 2015.04.14
3. Q_OBJECT Macro  (0) 2015.04.14
2. Signals and Slots  (0) 2015.04.14
1. HelloWorld  (0) 2015.04.14
Posted by 모래반지빵냐빵냐
,

이번엔 메인윈도우 클래스의 메뉴와툴바의 액션을 어떻게 설정하는지에 대해서 알아볼꺼임


Qt_QMainWindowArea_MenuBar_ToolBar_DockWindow_CentralWidget_StatusBar.png

음 위그림은 왜 대략적인 구조도인듯


QtGuiApplication.pngProjectManagement.png


아무튼 GUI 어플리케이션 프로젝트를 하나 만듬

ActionWindow.png

ui 부분에 가서 Type here에 file이라고 치고 

다음 하위 메뉴에 New Window 라고 치고 엔터!를 하면 아주 간단한 메뉴가 만들어짐

그런면 밑에 Action editor에 붉은색으로 메뉴가 하나 더 뜰것임 그것이 바로 New Window를 클릭했을때 어떻게 행동할 것인가를 처리하는 부분인듯 ?

DragAndDrop.png

이다음엔 Action editor에 있는 아이템을 끌어다가 붉은색 표시된 곳으로 드래그엔 드롭을 하면 메뉴바가 하나더 추가됨 

이렇게 하면 매뉴바의 2가지 버튼이 한가지액션을 공유하게 됨

RightMouseOnActionEditor.png

이제 액션 에디터에서 그림처리 Go to slot을 해서 이 메뉴들이 선택되었을때 어떤 액션을 취할 것인가를 지정해 주면됨GoToSlotTriggered.png

triggered()를 선택


그렇게 되면 위와 같은 소스코드가 자동적으로 생성되게 됨 이제 메뉴를 누르면 위의 함수가 실행되는것임

RunActionA.png 

그리고 실행해보면 이런창이 띄지만 별 기능은 없음

하지만 메뉴를 누를떄마다 

MainWindow::on_actionNew_Window_triggered()요 함수가 실행되고 있는거임



여기까지가 이제 메뉴바에 버튼을 추가하는 부분까지 이고 아래부터는 버튼을 눌렀을때 새로운 창을 띄우는 걸 해보겠음

가장 단순한 윈도우 창을 다이얼로그라고 부르는데 메인 다이얼로그가 새로운 다이얼 로그를 생성할때 메인 다이얼로그와 서브 다이얼로그가 동시에 제어가 되냐 안되냐에 따라서

Modal , Modaless로 나뉘게 됨. 모달은 메인이 제어가 안되고  modaless는 동시에 제어가 가능함.

고럼 모달부터 시작해보겠음. 

MyDialog.png 

일단 프로젝트에다가 오른 클릭해서 project->Add New->Qt->Qt Designer Form Class->Dialog without Buttons

FilesInTheProject.png 

추가하면 이렇게 다이얼로그 클래스가 추가가됨


그리고 mainwindow.cpp에 다음과같이 추가하면  새창띔 


Modaless 다이얼로그를 만들기 위해서 기존의 코드는 주석처리해주고


아래와 같이 코드를 바꿔보면 코드를 실행해서 버튼을 누르자마자 창이 꺼질거임 


이게 왜그러냐면 트리거 함수가 끝나면서 다이얼로그 메모리가 해제 되버리기때문임

고래서 요렇게

요렇게 하면 하면 Modaless 다이얼로그 생성됨

-끝-




'QT > Tutorials' 카테고리의 다른 글

5. QFile  (0) 2015.04.16
MainWindow and ImageViewer using Creator - Part A  (0) 2015.04.15
3. Q_OBJECT Macro  (0) 2015.04.14
2. Signals and Slots  (0) 2015.04.14
1. HelloWorld  (0) 2015.04.14
Posted by 모래반지빵냐빵냐
,

3. Q_OBJECT Macro

QT/Tutorials 2015. 4. 14. 13:50

Q_OBJECT 매크로에 대해서 알아보자




큐티 코딩을 하다보면 위와같은 큐 오브잭트 메크로가 클래스 정의 젤 윗부분에 보일 것이다.


Meta object system이나 시그널 실롯 등을 사용할때 꼭 명시를 해줘야 하는 부분이라고 설명이 되어있다


(Meta object system에 대해선 본문엔 the signals and slots mechanism, the run-time type information, and the dynamic property system 요렇게 나와있는데 뒤에 2개는 아직 QT를 다공부해보진않아서 모르겠다.)


실제로 매크로를 지우면 해당 시그널 슬롯이 동작을 안한다.


한마디로 큐티를 컴파일 하는 Meta object compiler(MOC)에게 이 클래스는 큐티기반의 클래스라는 것을 알려주는 역활을 하는것이다.


 큐티 기능을 쓰던 안쓰던 그냥 써놓으면 해가 되진않는듯하다 그냥 다 써놓으면 되는듯?


-끝- 


출처 : http://www.bogotobogo.com/Qt/Qt5_Q_OBJECT_Macro_Meta_Object.php 

'QT > Tutorials' 카테고리의 다른 글

MainWindow and ImageViewer using Creator - Part A  (0) 2015.04.15
4. Main Window and Action  (0) 2015.04.14
2. Signals and Slots  (0) 2015.04.14
1. HelloWorld  (0) 2015.04.14
QT 5.4.1 튜토리얼  (0) 2015.04.14
Posted by 모래반지빵냐빵냐
,

2. Signals and Slots

QT/Tutorials 2015. 4. 14. 11:30

이번 튜토리얼 에서는 윈도우 mfc에서의 메세지 핸들러 역활을 하는 signal slot 메커니즘에 대해서 설명함


QT widgets application으로 프로젝트를 하나만들고 forms 라는 폴더에 mainwindow.ui를 더블킬릭해보셈


CreatorDesign.png

그럼 요런 창이 뜸 MFC에 그것과 똑같은 역활을 함


Slider_ProgressBar.png

Horizontal Slider, Progress Bar 드래그 해서 붙여 넣고

GuiSlot.png

화살표에 보이는 거 누르고 

ConfigureConnection.png

위와 같이 두개 연결 시켜주고 실행 시키면

RunA.png

요렇게 슬라이더바랑 프로그래스바랑 같이 움직이는 프로그램 만들어짐


연결 해놓은거 떼버리고 


메인윈도우.cpp에 위와같이 코딩을 해넣어도 같은 효과로 작용함


이게 바로 QT의 signal and slot 시스템임


슬라이더바에서 움직였다는 시그널을 보내면 프로그래스바에서 그걸 캐치해서 바꿔줌 


-끝- 



이아니고 


http://www.bogotobogo.com/Qt/Qt5_SignalsSlotsGui.php에 밑에 Signal and slot 에 대한 설명이 영어로 되어있는데 읽어보면


좋음 


대략 내용은 기존에 프로그램에서는 callback 이란 것을 이용해서 이벤트 처리를 했다고 하는데


이 방법들은 type-safe ? 하지 않다고 함 그리고 call back 은 너무 강하게 연결성을 가지고 있다나 어쨋다나 아무튼 


시그널슬롯 짱짱맨이라는 말임




'QT > Tutorials' 카테고리의 다른 글

MainWindow and ImageViewer using Creator - Part A  (0) 2015.04.15
4. Main Window and Action  (0) 2015.04.14
3. Q_OBJECT Macro  (0) 2015.04.14
1. HelloWorld  (0) 2015.04.14
QT 5.4.1 튜토리얼  (0) 2015.04.14
Posted by 모래반지빵냐빵냐
,

1. HelloWorld

QT/Tutorials 2015. 4. 14. 11:18

뉴 프로젝트에서 콘솔 프로젝트 생성

NewProject.png 
위 그림은 5.3 버전이라 5.4랑 메뉴가 몇개 다를 거임 


당황하지 말고 Qt console application 선택하셈


ConsoleLocation.png 


이름정해주고 피니쉬 하면


#include <QCoreApplication>

 int main(int argc, char *argv[]) { 

QCoreApplication a(argc, argv); 

return a.exec();

 } 


요런 코드가 나올거심 Qcoreapplication은  콘솔 어플리케이션(non-GUI)의 이벤트 루프를 제공해준다고 함 

GUI 어플리케이션에서는 Qapplication 사용한다고함


Qcoreapplication 객체에서 exec()함수를 실행하면 이벤트 루프가 실행이 됨. 그럼 윈도우가 메세지를 날리면 받을 준비를 하는거임


ctl+r을 누르던가 녹색 삼각형 누르면 실행됨


하지만 아무것도 실행 되지는 않고 멈춰 있음 당연한거임 


프로그램을 실행을 실행하면 Qt 어플은 다음과 같은 순서로 컴파일됨

1. qmake 란게 먼저 .pro파일을 분석하고 makefile이란걸만듬

2. 만들어진 메이크파일을 프로그램이 빌드를 한다는군 



요것은 헬로우 월드를 띄우기 위한 코드 

방법이 어찌됫던  띄워진 모습

-끝-




'QT > Tutorials' 카테고리의 다른 글

MainWindow and ImageViewer using Creator - Part A  (0) 2015.04.15
4. Main Window and Action  (0) 2015.04.14
3. Q_OBJECT Macro  (0) 2015.04.14
2. Signals and Slots  (0) 2015.04.14
QT 5.4.1 튜토리얼  (0) 2015.04.14
Posted by 모래반지빵냐빵냐
,

QT 5.4.1 튜토리얼

QT/Tutorials 2015. 4. 14. 11:06

을 시작 해볼려고 생각중



qt 홈피에서 커뮤니티 버전으로 위에 껄 깔았어요 


그리고 http://www.bogotobogo.com/Qt/Qt5_TutorialHelloWorld.php 

여기 K Hong 님 자료를 이용해볼 생각임 

큐티에 대한 설명은 따로 하지않겠음 큐티를 찾는 분들은

왜 큐티가 필요한지 다들 알고 왔으리라 생각됨 

홈피에다 글쓰는 것도 첨이기도하고 컴공 출신이 아니여서 전문적이진 못할듯 많은 어려움이 있을지도 흠

바빠지면 못할수도 있음 하는데까지 최선을 다해봄!




'QT > Tutorials' 카테고리의 다른 글

MainWindow and ImageViewer using Creator - Part A  (0) 2015.04.15
4. Main Window and Action  (0) 2015.04.14
3. Q_OBJECT Macro  (0) 2015.04.14
2. Signals and Slots  (0) 2015.04.14
1. HelloWorld  (0) 2015.04.14
Posted by 모래반지빵냐빵냐
,

프로젝트에 .pro 파일에 아래와 같이 작성한다.

 

INCLUDEPATH += C:\Python34\include

QMAKE_LIBDIR += C:\Python34\libs

 


'QT > Basics' 카테고리의 다른 글

QT) QMessageBox  (0) 2015.04.15
QT tr() 다국어 지원  (0) 2015.04.15
Visual Studio 2013으로 Qt 사용하기  (0) 2015.04.13
Qt5 VS2010으로 사용하기 [출처] Qt5 VS2010으로 사용하기  (0) 2015.04.13
제목표시줄 없애기  (0) 2015.04.08
Posted by 모래반지빵냐빵냐
,

출처 : http://blog.naver.com/lobo_prix/220141339468

우선 OpenGL을 사용하기 전에, 프로젝트 설정이 되어야 한다.

 

QtCreator의 경우 .pro 파일에 QT += opengl 라고 추가해주고

VisualStudio의 경우 프로젝트 우클릭 - Qt Project Settings - Qt Modules - OpenGL 체크 해주면 된다.

 

QWidget 대신에 QWidget의 파생클래스인 QGLWidget을 상속받아서 작성한다.


'QT > OpenGL' 카테고리의 다른 글

OpenGL 화면 캡쳐해서 BMP 파일로 저장  (0) 2015.04.08
OpenGL에서 팝업(Popup) 메뉴 사용하기  (0) 2015.04.08
QT에서 OpenGL 사용하기  (0) 2015.04.03
Posted by 모래반지빵냐빵냐
,

출처 : http://blog.naver.com/lobo_prix/220137724015


우선 Visual Studio 2013과 Qt5가 깔려있다는 가정을 하고 진행하겠다.

 

Visual Studio Add-in 1.2.3 for Qt5 를 다운받고 설치까지 한다.

 

Qt5 - Qt Options - Add

(메뉴바에 Qt5 항목이 새로 생겨있습니다) 

 

대화상자에 Name 은 Qt5.3.2 로 하고 Path는 C:\Qt\Qt5.3.2\5.3\msvc2013_64_opengl 로 설정해준다.

(버전이나 설치한 경로에 따라 다름, Name은 그냥 아무거나하고 Path 는 qmake.exe의 위치를 지정)

 

New Project - Qt Application 선택하고 프로젝트 만들고 빌드해보자.

 

32bit 사용자라면 빌드되겠지만 64bit 사용자라면 아래와 같은 오류를 보게된다.

fatal error LNK1112: module machine type 'x64' conflicts with target machine type 'X86'

 

아래의 링크를 참고하여 설정을 64bit로 바꿔준다

http://blog.naver.com/lobo_prix/220125630463 

 

그 다음, Qt 설정에도 아래와 같이 명시해줘야한다.

프로젝트 우클릭 - Qt Project Settings - Version 을 Qt5.3.2로 선택

 

정상적으로 빌드와 실행이 됩니다.


Posted by 모래반지빵냐빵냐
,

출처 : http://cccob.blogspot.kr/2013/11/qt51-visual-studio-2012-add-in-windows.html


QT5.1 설치 및 Visual Studio 2012 Add-in 설치(Windows)

QT는 MFC와 같은 C++ 프레임워크이고 가장 장점으로는 크로스 플랫폼이라는 것이다.
예전부터 임베디드 환경에서 애용되고 있다. 오픈소스이지만 상용으로 사용할 때 라이센스가 다르므로 확인하고 넘어가도록 하자.


TrollTech -> nokia -> Digia 인수되었다.



환경
Windows7 Ultimate K  64bit
Visual Studio 2012  64bit ( update 3 )


1. http://qt-project.org/  에서 Qt 5.1.1 for Windows 64 - bit(VS 2012)를 다운받는다.

2. Visual Studio Add-in 1.2.2 for Qt5 를 다운받는다.

3. 1번에서 다운받은 파일을 설치한다.

4. 2번에서 다운받은 파일을 설치한다.

5. 내컴퓨터 -> 속성 -> 시스템 속성에서 환경변수를 추가한다.

6. 변수이름   QTDIR
    변수값      C:\Qt\Qt5.1.1\5.1.1\msvc2012_64;

7. Visual Studio를 켜서 QT5 탭으로 이동한다.

8. QT Option을 선택하여 QT Versions에 Add를 한다.

9. Version name    QT5.1
    Path  C:\Qt\Qt5.1.1\5.1.1\msvc2012_64

10. 설정해 주고 실행하면 LNK1112 에러가 난다. (x86과 x64가 다르다나..)

11. 프로젝트 속성 -> 링커 -> 고급 -> 대상컴퓨터 -> MachineX64로 바꾼다.

12. 그래도 실행하면 에러가 난다.(x64로 빌드가 되는지 확인한다)

13. 프로젝트 속성 -> Qt Project Settings 를 선택한다.

14. Properties탭에서 Version을 고른다.

15. 실행한다.


'QT > Basics' 카테고리의 다른 글

Include Path & Library Path 설정하기  (0) 2015.04.13
Visual Studio 2013으로 Qt 사용하기  (0) 2015.04.13
제목표시줄 없애기  (0) 2015.04.08
스타일쉬트(Style Sheet) 사용하기.  (0) 2015.04.08
사용자 정의 클래스.  (0) 2015.04.08
Posted by 모래반지빵냐빵냐
,

PCL 환경 설정

PCL/환경설정 2015. 4. 10. 15:10



Point Cloud라는 걸 들어보셨나요? 흔히 키넥트로는 사물을 2차원적인 Depth나 RGB로만 받을 수 있습니다. 물론 외부적으로 라이브러리를 써서 이를 3D로 매핑해주는 것도 있습니다. 그런 라이브러리 중 하나가 바로 이번 포스트에서 소개해드릴 Point Cloud라는 겁니다. 쉽게 설명하면 하나의 점군이라고 보시면 됩니다. 점군이니까 각각의 점마다 3차원적 좌표가 나타나고 거기에 실제의 RGB값들이 대입되게 되는 것이지요. 



 기존에 OpenCV나 OpenNI 설치를 충분히 따라오셨다면 이번 설치도 별반 차이가 없습니다. 그냥 Linker 연결이나 include 폴더, lib 목록 작성이 다 입니다. 

참고로 이 PCL은 OpenNI 기반으로 동작합니다. 앞에서 소개했던 브릿지 드라이버를 사용해도 되기는 하지만 MS 드라이버를 설치하게 되면 4m이상의 거리에서의 raw data 값이 나오지 않기 때문에 추천하지 않는 바입니다. 

그럼 PCL 사이트에서 자신의 환경에 맞는 설치 파일을 실행한 것을 가정하고 VS2010 상에서 연결하는 방법을 언급하고자 합니다. 

 우선 c++ 프로젝트를 하나 생성하고 프로젝트를 선택하고 속성으로 들어갑니다. 처음으로 해줘야 하는 것은 include 폴더 지정입니다. VC++ 항목으로 가서 include Directory와 library directory를 다음과 같이 지정해줍니다.



이 과정을 거치면 컴파일러 내부적으로 해당 폴더에 있는 헤더 파일을 읽어옵니다. 마지막으로 해줘야 할 작업은 바로 Additional Dependacy를 지정해주는 겁니다. 역시 다음과 같이 작성해줍니다. 



이제 이로써 PCL에서 사용할 수 있는 모든 변수를 코드안에 삽입할 수 있게 됩니다. 물론 Debug 모드로 실행하실 분이라면 다시 폴더를 확인하셔서 적절하게 수정하시기 바랍니다. 

 자 여기까지가 환경설정이었습니다. 만약 정상적으로 작성이 되었다면 아래의 코드를 삽입해서



해당 프로젝트 폴더에 test라는 이름의 pcd(Point Cloud data) 파일이 생성되는 지를 확인해보시면 됩니다. 만약 sample 코드를 그대로 사용하고 싶다 하시면 임의의 폴더를 하나 만든 후에 cmake를 통해서 해당 프로젝트를 생성하면 만들어집니다. 


참고로 위에서 만든 pcd 파일은 reader로 읽어보면 다음과 같은 결과가 나옵니다.



맞게 나오지요. 원래 xyz를 0으로 만드는 구문과 3으로 만드는 구문으로 나눠져 있으니까요. 


여기까지가 PCL 설정이었고 이제 Kinect로 활용하기 위해서는 라이브러리를 연동시켜야 합니다. 여기서 한가지 예제를 더 돌려보려는데 예제에는 Visualization Toolkit(vtk) 와 Boost가 필요합니다. 한꺼번에 include 폴더와 library 폴더를 연동시켜야 합니다. 





마지막으로 Additional dependancies에서 OpenNI 관련 lib 파일을 추가시켜주면 됩니다.



끝입니다. 여기다가 OpenCV도 쓰려면 관련 라이브러리를 추가시켜주면 되겠지요. 물론 복잡하기는 하겠지만..

예제 샘플은 아래와 같습니다.


#include <pcl/io/openni_grabber.h>

#include <pcl/visualization/cloud_viewer.h>

#ifdef WIN32
# define sleep(x) Sleep((x)*1000)
#endif 

class SimpleOpenNIViewer
{
  public:
   SimpleOpenNIViewer () : viewer ("PCL OpenNI Viewer") {}

    void cloud_cb_ (const pcl::PointCloud<pcl::PointXYZ>::ConstPtr &cloud)
    {
          if (!viewer.wasStopped())
        viewer.showCloud (cloud);
    }

    void run ()
    {
      pcl::Grabber* interface = new pcl::OpenNIGrabber();

      boost::function<void (const pcl::PointCloud<pcl::PointXYZ>::ConstPtr&)> f = 
                boost::bind (&SimpleOpenNIViewer::cloud_cb_, this, _1);

      interface->registerCallback (f);

      interface->start ();

      while (!viewer.wasStopped())
      {
        sleep (1);
      }

          interface->stop ();
    }

    pcl::visualization::CloudViewer viewer;
};

int main ()
{
    SimpleOpenNIViewer v;
    v.run ();
    return 0;

}


출처: OpenKinect (http://cafe.naver.com/openkinect?20120710010352)


결과는 Point Cloud가 적용된 DepthImage가 출력됩니다.




앞으로도 다른 샘플이 있으면 시도해보고자 합니다.

'PCL > 환경설정' 카테고리의 다른 글

PCL을 통하여 Hello World 찍기  (0) 2015.04.10
Posted by 모래반지빵냐빵냐
,

윈도우에서  PCL을 설치하였으면 제대로 동작하는지 확인할 필요가 있다.

 

TestPCL 콘솔 프로젝트를 만들어서 간단하게 테스트해 보도록 하자.

 

PCL 1.6과 Visual Studio 2008을 기준으로 작성되었다.

 

 

1. TestPCL.cpp 파일에 코딩을 한다.

 

// TestPCL.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>

using namespace std;
using namespace pcl;
using namespace io;


int _tmain(int argc, _TCHAR* argv[])
{
 PointCloud<PointXYZ> cloud;

 // 5x1 짜리 xyz point cloud data buffer를 할당한다.

 cloud.width    = 5;
 cloud.height   = 1;
 cloud.is_dense = false;
 cloud.points.resize (cloud.width * cloud.height);

 

 //랜덤 값을 넣어준다.

 for (size_t i = 0; i < cloud.points.size (); ++i)
 {
  cloud.points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);
  cloud.points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);
  cloud.points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);
 }

 

 //  값을 저장한다.

 savePCDFileASCII ("test_pcd.pcd", cloud);

 cerr << "Hello World" << endl;
 cerr << "Saved " << cloud.points.size () << " data points to test_pcd.pcd." << endl;

 

 // 값을 터미널에 출력한다

 for (size_t i = 0; i < cloud.points.size (); ++i)
  cerr << "    " << cloud.points[i].x << " " << cloud.points[i].y << " " << cloud.points[i].z << endl;


 return 0;
}

 

2. Property 설정을 한다.

   Configuration Prpperties -> C/C++ -> Additional Include Directories

   Configuration Properties -> Linker -> Additional Library Directories

 

   -> 설정해주는 파일들은 OpenNI, PCL, boost, Eigen,, FLANN, Qhull, VTK

 

* Additional Include Directories 

  " c:\Program Files (x86)\OpenNI\Include";"c:\Program Files (x86)\PCL 1.6.0\include\pcl-1.6";"c:\Program Files (x86)\PCL 1.6.0\3rdParty\Boost\include";"c:\Program Files (x86)\PCL 1.6.0\3rdParty\Eigen\include";"c:\Program Files (x86)\PCL 1.6.0\3rdParty\FLANN\include";"c:\Program Files (x86)\PCL 1.6.0\3rdParty\Qhull\include";"c:\Program Files (x86)\PCL 1.6.0\3rdParty\VTK\include\vtk-5.8"

  

* Additional Library Directories

  c:\Program Files (x86)\openNi\Lib;c:\Program Files (x86)\PCL 1.6.0\lib;c:\Program Files (x86)\PCL 1.6.0\3rdParty\Boost\lib;c:\Program Files (x86)\PCL 1.6.0\3rdParty\FLANN\lib;c:\Program Files (x86)\PCL 1.6.0\3rdParty\Qhull\lib;c:\Program Files (x86)\PCL 1.6.0\3rdParty\VTK\lib\vtk-5.8;

 

 

  

 

 

3. stdafx.cpp 파일에 라이브러리를 링크시킨다.

   게시글 (PCL을 설치하여보자)와 같은 내용이다. http://blog.daum.net/openpcl/6 


#ifdef _DEBUG
 #pragma comment(lib, "pcl_apps_debug.lib")
 #pragma comment(lib, "pcl_common_debug.lib")
 #pragma comment(lib, "pcl_features_debug.lib")
 #pragma comment(lib, "pcl_filters_debug.lib")
 #pragma comment(lib, "pcl_io_debug.lib")
 #pragma comment(lib, "pcl_io_ply_debug.lib")
 #pragma comment(lib, "pcl_kdtree_debug.lib")
 #pragma comment(lib, "pcl_keypoints_debug.lib")
 #pragma comment(lib, "pcl_octree_debug.lib")
 #pragma comment(lib, "pcl_registration_debug.lib")
 #pragma comment(lib, "pcl_sample_consensus_debug.lib")
 #pragma comment(lib, "pcl_search_debug.lib")
 #pragma comment(lib, "pcl_segmentation_debug.lib")
 #pragma comment(lib, "pcl_surface_debug.lib")
 #pragma comment(lib, "pcl_tracking_debug.lib")
 #pragma comment(lib, "pcl_visualization_debug.lib")

#else

 #pragma comment(lib, "pcl_apps_release.lib")
 #pragma comment(lib, "pcl_common_release.lib")
 #pragma comment(lib, "pcl_features_release.lib")
 #pragma comment(lib, "pcl_filters_release.lib")
 #pragma comment(lib, "pcl_io_release.lib")
 #pragma comment(lib, "pcl_io_ply_release.lib")
 #pragma comment(lib, "pcl_kdtree_release.lib")
 #pragma comment(lib, "pcl_keypoints_release.lib")
 #pragma comment(lib, "pcl_octree_release.lib")
 #pragma comment(lib, "pcl_registration_release.lib")
 #pragma comment(lib, "pcl_sample_consensus_release.lib")
 #pragma comment(lib, "pcl_search_release.lib")
 #pragma comment(lib, "pcl_segmentation_release.lib")
 #pragma comment(lib, "pcl_surface_release.lib")
 #pragma comment(lib, "pcl_tracking_release.lib")
 #pragma comment(lib, "pcl_visualization_release.lib")
#endif

 

4. 프로그램을 실행하면 아래와 같이 출력되면 성공이다

 

   

 

* 테스트 프로그램 


TestPCL.zip


'PCL > 환경설정' 카테고리의 다른 글

PCL 환경 설정  (0) 2015.04.10
Posted by 모래반지빵냐빵냐
,

Qt4 Window버전

1.QMainWindow 생성자에서

MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent, Qt::FramelessWindowHint),
    ui(new Ui::MainWindow)
{
}

2. X11 용으로 

QWidget::setWindowFlags(Qt::Window|Qt::FramelessWindowHint); 
showFullScreen(); 
를 적용하여 프레임 없는 풀스크린 윈도우를 꾸몄습니다. 
Embeded 도 가능할듯 하네요.
  


3. 처음 위젯을 선언할때

korail_info_server::korail_info_server(QWidget *parent) 
    : QWidget(parent , Qt::FramelessWindowHint)

Posted by 모래반지빵냐빵냐
,