error: Qt Creator needs a compiler set up to build. Configure a compiler in the kit options.


QT를 설치하고 새 프로젝트를 만들어 빌드를 하였더니 위와같은 에러가 발생.


Build ->Open Build and Run Kit Selector 를 선택하면 kit 과 build를 선택 할 수 있는 창이 뜬다.


Desktop QT 5.1.1 MSVC 2010 32bit 를 Desktop Qt 5.1.1 MinGW 32bit 로 변경 후 빌드 ~ 정상작동 확인.
 






QT 설치하기

Window 환경에서 설치하는 방법.


위 사이트에 접속하여 원하는 버전을 다운받는다.
여기서는 5.1 버전을 다운 받았다.

다운받은 파일을 실행시켜 그대로 설치하면 끝.

설치 중간 라이센스 확인, 하위 버전 설치여부 등 선택을 할 수 있다.

 






#include <QApplication>
#include <QTreeWidget>
#include <QTreeWidgetItem>

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

    QTreeWidget* treewidget = new QTreeWidget();

    QTreeWidgetItem* header = new QTreeWidgetItem;
    header->setText(0, "name");
    header->setText(1, "age");
    header->setText(2, "etc");
    treewidget->setHeaderItem(header);

    QTreeWidgetItem* row1 = new QTreeWidgetItem(treewidget);
    row1->setText(0, "col 1");
    row1->setText(1, "col 2");
    row1->setText(2, "col 3");

    QTreeWidgetItem* row2 = new QTreeWidgetItem;
    treewidget->addTopLevelItem(row2);
    row2->setText(0, "?");
    row2->setText(1, "??");
    row2->setText(2, "???");

    QTreeWidgetItem* subItem1 = new QTreeWidgetItem;
    subItem1->setText(0, "? - 1");
    subItem1->setText(1, "? - 2");
    subItem1->setText(2, "? - 3");
    row2->addChild(subItem1);

    QTreeWidgetItem* subItem2 = new QTreeWidgetItem;
    subItem2->setText(0, "? - 1");
    subItem2->setText(1, "? - 2");
    row2->addChild(subItem2);

    treewidget->resize(500, 500);
    treewidget->setSortingEnabled(TRUE);
    treewidget->show();

    return app.exec();
}

이번에는 TreeWidget을 만들어 보도록 하겠습니다.


02 ~ 03. 필요한 헤더파일을 추가시킵니다.

09. QTreeWidget 객체를 생성합니다.

11. QTreeWidgetItem 객체를 생성하고

12 ~ 14. 생성한 item 객체에 3개의 column을 만들었습니다.

15.  treewidget 객체에 방금 생성한 item 객체를 헤더로 추가합니다.


여기까지 최상단 목록을 만들었습니다.


17. QTreeWidgetItem 객체를 생성 합니다. item 객체를 생성하는데에는 두가지 방법이 있는것 같은데요. 17, 22 ~ 23. 라인을 보시면 조금은 다르게 되어있지요.

자세한건 모르겠지만 두개가 같은 결과를 얻습니다.

18 ~ 20. 생성한 item에 3개의 column을 만들었습니다.


여기까지 행을 만드는 방법입니다.


이번에는 하나의 행에 속해있는 또 하나의 행(서브)을 만들어 보도록 하겠습니다.


28 ~ 31. 위와 같은 방법으로 item 객체를 생성하고 column을 추가합니다.

32. 해당 item 객체를 위에서 만든 row2 객체의 자식으로 추가합니다.

34 ~ 37. 여러개의 자식을 추가시킬 수 있습니다.


40. 해당 옵션을 사용하면 최상위 목록을 클릭했을때 자동정렬이 되도록 할 수 있습니다.








릴리즈 버전으로 빌드 후 exe 파일을 실행시켰을때 dll이 없다는 에러가 나오면 해당하는 dll을 프로젝트에 포함시키면 됩니다.


하지만 dll을 포함하였음에도 '프로시저 시작 지점 ?...' 이라는 에러나 발생할때는 qt\bin안에 있는 dll이 아닌


qt\qtcreator\bin 안에 있는 dll을 포함시켜주니 정상 작동합니다.



'QT' 카테고리의 다른 글

QT 설치하기  (0) 2013.09.08
[ Qt ] QTreeWidget 만들기  (0) 2012.10.02
[ Qt ] 프로그램 배포시 에러 ( 프로시저 시작 지점 ... )  (0) 2012.10.02
[ Qt ] 로그 출력 ( print console )  (0) 2012.10.01
[ Qt ] 시그널 / 슬롯  (0) 2012.10.01
[ Qt ] 메뉴바 생성하기  (0) 2012.10.01



qDebug() << " 블라블라 ~ ";






이 전 메뉴바 만들기에서 시그널과 슬롯을 사용해 보았습니다.

슬롯은 시그널과 연결될 수 있고 시그널과 연결된 슬롯은 해당 시그널이 발생될 때마다 자동으로 호출됩니다.

시그널/슬롯 매커니즘은 QObject에 구현되어 있으 QObject를 상속받는 클래스라면 어디에서든 사용이 가능합니다.


connect(sender, SIGNAL(signal), receiver, SLOT(slot));


sender와 receiver는 QObject에 대한 포인터이며 signal과 slot은 매개변수의 이름이 생략된 함수 시그너처 입니다.

SIGNAL()과 SLOT() 매크로는 자신의 인자를 문자열로 변환하는 역할을 담당합니다.



기본적으로 시그널과 슬롯은 아래와 같이 연결될 수 있습니다.


- 하나의 시그널이 여러 개의 슬롯에 연결될 수 있다.

connect(sender, SIGNAL(signal), receiver, SLOT(slot1));

connect(sender, SIGNAL(signal), receiver, SLOT(slot2));


- 여러 개의 시그널이 하나의 슬롯에 연결될 수 있다.

connect(sender, SIGNAL(signal1), receiver, SLOT(slot));

connect(sender, SIGNAL(signal2), receiver, SLOT(slot));


- 시그널은 또 다른 시그널에 연결될 수 있다.

connect(sender, SIGNAL(signal), receiver, SIGNAL(signal));

- 기존에 설정된 연결은 해제될 수 있다. ( Qt는 객체가 삭제될 때 그 객체가 갖고 있던 모든 연결을 해제합니다. )

disconnect(sender, SIGNAL(signal), receiver, SLOT(slot));

또한, 시그널과 슬롯이 정상적으로 연결되려면 매개변수 타입과 순서가 동일해야 합니다.

connect(sender, SIGNAL(signal_test(int, const QString &)), receiver, SLOT(slot_test(int, const QString &));

하지만 시그널이 슬롯보다 더 많은 매개변수를 갖는 경우에는 예외적으로 연결되 가능하며, 시그널이 갖는 추가적인 매개변수는 무시 됩니다.

connect(sender, SIGNAL(signal_test(int, const QString &)), receiver, SLOT(slot_test(int));






이번에는 상단 메뉴바를 생성하는 예제 입니다.


main.cpp

#include 
#include <qtextcodec>
#include "mainwindow.h"

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

    QTextCodec::setCodecForTr(QTextCodec::codecForName("eucKR"));

    MainWindow *mainWindow = new MainWindow();
    mainWindow->setFixedSize(500, 400);
    mainWindow->show();

    return app.exec();
}

한글 출력을 위해 코덱을 설정해 주었으며 mainwindow를 사용자가 창을 조절하지 못하도록 생성하였습니다.



mainwindow.h


#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <qmainwindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow();

private:

private slots:
    // 파일
    void Main_SlotNewFile();

    // 테스트
    void Main_SlotTest1();
    void Main_SlotTest2();
    void Main_SlotTest3();
};
#endif // MAINWINDOW_H
mainwindow의 헤더파일 입니다.

QMainWindow를 상속받고 있습니다.


마지막 부분을보면 slots이라는 키워드가 있습니다.

이 슬롯은 다음에 설명하기로 하겠습니다.



mainwindow.c 소스 파일로 넘어갑니다.


#include <QMenuBar>
#include <QStatusBar>
#include <QAction>
#include "mainwindow.h"

MainWindow::MainWindow()
{
    QMenu *pFileMenu;
    QStatusBar *pStartusbar;

    // 파일
    QAction *pSlotNewFile = new QAction(tr("새 파일"), this);
    pSlotNewFile->setShortcut(tr("Ctrl+N"));
    pSlotNewFile->setStatusTip(tr("새 파일을 생성합니다."));
    connect(pSlotNewFile, SIGNAL(triggered()), this, SLOT(Main_SlotNewFile()));

    pFileMenu = menuBar()->addMenu(tr("파일"));
    pFileMenu->addAction(pSlotNewFile);

    // 테스트
    QAction *pSlotTest1 = new QAction(tr("테스트 1"), this);
    pSlotTest1->setShortcut(tr("Ctrl+T"));
    pSlotTest1->setStatusTip(tr("1번 메뉴 테스트"));
    connect(pSlotTest1, SIGNAL(triggered()), this, SLOT(Main_SlotTest1()));

    QAction *pSlotTest2 = new QAction(tr("테스트 2"), this);
    pSlotTest2->setStatusTip(tr("2번 메뉴 테스트"));
    connect(pSlotTest2, SIGNAL(triggered()), this, SLOT(Main_SlotTest2()));

    QAction *pSlotTest3 = new QAction(tr("테스트 3"), this);
    pSlotTest3->setStatusTip(tr("3번 메뉴 테스트"));
    connect(pSlotTest3, SIGNAL(triggered()), this, SLOT(Main_SlotTest3()));

    pFileMenu = menuBar()->addMenu(tr("테스트"));
    pFileMenu->addAction(pSlotTest1);
    pFileMenu->addAction(pSlotTest2);
    pFileMenu->addAction(pSlotTest3);

    // 상태바 연결
    pStartusbar = statusBar();
}

void MainWindow::Main_SlotNewFile()
{

}

// 이미지
void MainWindow::Main_SlotTest1()
{

}
void MainWindow::Main_SlotTest2()
{

}
void MainWindow::Main_SlotTest3()
{

}

메뉴바 생성을위한 몇가지 헤더파일이 추가되어있습니다.

08 ~ 09. 라인에서 QMenu와 QStatusBar를 선언하였습니다. QMenu는 만들고자 하는 메뉴바, QStatusBar는 화면 하단 상태바 입니다. 
12. 라인에서 QAction을 생성하고 있습니다. QAction은 큰 메뉴안에 들어가는 작은 메뉴입니다.
13. 라인에서는 단축키를 지정해주고 있습니다. Ctrl+N을 누르면 '새 파일'이 실행되겠지요.
14. 라인에서는 상태바에 출력될 팁을 작성하고 있습니다. '새 파일'에 마우스를 올려놓으면 하단 상태바에 해당 문구가 출력 됩니다.
15. 라인은 시그널과 슬롯을 연결해 주고 있는데요, 아직 시그널과 슬롯을 다루지 않았으므로 간단하게 설명하겠습니다.

connect(pSlotNewFile, SIGNAL(triggered()), this, SLOT(Main_SlotNewFile()));
pSlotNewFile 이 SIGNAL(triggered())되면 this의 SLOT(Main_SlotNewFile())을 실행시켜라.

시그널과 슬롯의 관계를 알지 못해도 어떠한 방식으로 사용되는지 아실 수 있으실 겁니다.

17 ~ 18. 라인은 상위 메뉴바에 '파일' 이라는 큰 메뉴를 생성하고 지금까지 만든 '새 파일' 액션을 추가시켜 줍니다.

21 ~ 37. '새 파일' 액션을 만든 것 처럼 나머지 메뉴도 생성하여 줍니다.

40. QStatusBar에 상태바를 연결하여 줍니다.


빌드 후 실행해보면 아래와같은 프로그램이 실행이 됩니다.





위 스크린샷을 보시면 지금까지 작업한 것들이 정상적으로 출력되고 있습니다.

1. 파일과 테스트라는 큰 메뉴가 존재하고

2. 생성한 액션만큼 하위 메뉴가 만들어졌으며

3. 단축키를 지정한 액션에 단축키가 등록되어 있습니다.

4. 화면 하단에 상태바도 정상적으로 작동 하는군요.


:)






창이 움직이지 않아야 하는 프로그램이라면 창의 사이즈를 입력시킬때


setFixedSize(width, height)로 입력을해주면 사용자가 창 크기를 변경 시킬 수 없습니다.






텍스트를 출력할때 tr("한글")을 사용하면 이상한 문자로 출력될때 해결방법 입니다.


간단하게 main에

#include <QTextCodec>

int main(..

QTextCodec::setCodecForTr(QTextCodec::codecForName("eucKR"));

..
}



헤더 하나와 소스 한줄을 추가하고 실행하면 한글이 정상적으로 출력됩니다.



+ Recent posts