기존 클래스를 수정해서 추가하거나


수정하면 이런 애러가 보일 것이다.


클래스 명도 명확하고 정의 링크를 따라가도 있고


헤더파일도 정확하게 추가해도 날 것이다.


이건. 클래스 명을 정의하는 #define에 대한 내용이 구현된 클래스와 달라서 발생한다/


A라는 클래스를 추가하면 다음과 같은 형식이다/


#ifndef AAA_H

#define AAA_H


class AAA : public QObject

{

}

#endif // AAAA_H


수정을 하면 다음과 같은 상황이 발생할 수 있다.

#ifndef AAA_H

#define AAA_H


class AAC : public QObject

{

}

#endif // AAAA_H

이때 발생하는 애러가 Does not name a type 이다!

#ifndef와 #define 만 AAC로 바꿔주면 된다.


by 무위자연 2015. 8. 3. 13:55

QWidet을 상속 받은 클래스의 경우에

객체를 직접 사용하지 못하게 QT에서는 막고 있다.

그래서 그대로 사용하게 되면 다음과 같은 애러가 발생하며

해당 내용에 대해서 알기가 어렵다.

애러는 다음과 같이 난다.

C:\Qt\Qt5.4.1\5.4\mingw491_32\include\QtWidgets\qwidget.h:719: error: 'QWidget::QWidget(const QWidget&)' is private

     Q_DISABLE_COPY(QWidget)


C:\Users\User\Documents\xxxxxx\trunk\application\mainview\glucosedownloadlist.h:13: error: within this context

 class GlucosedownloadList : public QWidget, public UITableViewDelegate


그러므로 해당하는 경우에 객체를 직접 접근하지 말고 referece(포인터)를 이용해서 접근해서 해결한다.

       ^

                    ^

by 무위자연 2015. 7. 28. 20:39

1. 소스를 빌드를 한다


- 다국어 지원을 위한 QT Liguist를 이용했다면 언어 파일의 update/release를 해줘야 한다


2. release 모드로 빌드한 폴더로 가서 "exe"를 제외하고 모두 삭제한다.

- 실행을 위한 추가적인 파일/dll이 있다면 빌드한 폴더에 추가한다


3. Qt 5.4 for Desktop (MinGW 4.9 32 bit)을 이용하여 command 창을 띄우고 빌드 된 폴더로 이동한다.

“windeployqt XXXXXXX.exe” 를 입력한다

- 이렇게 하면 반드시 필요한 .dll(대부분의 QT dll)이 포함된 상태로 된다.


4. 3번의 폴더를 패키징을 위한 프로그램으로 패키지를 만들거나 해당 폴더를 복사해서 실행하면

QT 환경을 따로 구축하지 않아도 정상적으로 실행되게 된다.


by 무위자연 2015. 6. 10. 17:38


//기본 클라이언트의 실행 파일 주소를 알수 있다.

QSettings settings("HKEY_CLASSES_ROOT\\mailto\\shell\\open\\command",QSettings::NativeFormat);
QString value = settings.value(".").toString();

//실제 가져와 보면 이런 값들이 있다.

"C:\PROGRA~1\MICROS~1\Office15\OUTLOOK.EXE" -c IPM.Note /mailto "%1"


이걸 직접 쓰는데는 문제가 있어서 난 이렇게 했다.


QProcess process;

        QString program;//

value.replace("\"",""); //레지스트리 값의 따옴표 제거

value.replace("\\","\\\\"); //경로 구분자 변경

value.replace("/mailto",""); //제거

        value.replace("%1","");//제거
        value.replace("-c","");//제거
        value.replace("IPM.Note","");//제거

        program = value;

QStringList attach = QStringList()<<"/c" << "ipm.note"<<"/a" << "C:/valid.png";//이미 레지스트리에 있는 값 중에 내가 원하는 인자를 string list로 추가함

        process.start(program,attach);

process.waitForFinished();//해당 코드는 OS 환경에 따라서 필요 없기도 하지만 난 무조건 추가한다.



by 무위자연 2015. 5. 7. 16:50

별거 아닌데 찾기가 어렵더라고


특별한 것도 아닌데 process를 쓰라니,. batch 파일을 쓰니 하지만


제일 간단한건.


하기와 같이 2줄이면 끝.


QProcess::startDetached(QApplication::applicationFilePath());
exit(12);


참 쉽죠잉~

by 무위자연 2015. 4. 17. 17:23

QT에서는 그룹 내 라디오 버튼 중에 반드시 하나는 선택되어야 한다


그래서 다음과 같은 코드가 안 먹는다.


예를 들어


ui->radio1->setcheck(false);

ui->radio2->setcheck(false);

ui->radio3->setcheck(false);

한번이라도 이 그룹의 라디오버튼이 클릭된 상태라면

상태가 변하지 않는다 그룹으로 묶여있기때문에.


그러므로 전체가 선택 안된 상태 혹은 모두가 선택된 상태를 만들기 위해서는 잠시 그룹을 끊어야 한다.


다음과 같이 

theSelectedButton->setAutoExclusive(false);
thsSelectedButton->setChecked(false);
theSelectedButton->setAutoExclusive(true);
각 버튼 별로 해서 상태를 바꾼 다음에 다시 묶어주면 끝


by 무위자연 2015. 3. 17. 18:01

QTextStream outstream(&outputFile);

QTextCodec *codec = QTextCodec::codecForLocale();

QString name = "김동현";

outstream << codec->toUnicode(name.toLocal8Bit()) << ",,";

outputFile.close();

by 무위자연 2015. 3. 17. 10:30


Project -> Build Steps -> Make : mingw32-make -> 옵션 -j [#] 추가하면 됩니다


QT Creator의 컴파일러를 mingw를 사용할 경우에


하기와 같이 컴파일러가 사용할 CPU 코어수를 추가해주면 된다.


해당 CPU수는 VIRTAUL CPU를 적당히 감암해서 사용한다


명령어 cmd : -j core# / 


내 경우에는 i-7 4 VCPU / 2CPU라서 3개 정도만 할당해서 사용한다


그럴 경우에 rebuild 할 경우에 1 코어때는 3:05 초 정도 걸리는 것이 3개를 사용하면 1:50초 정로로 빨

라진다.




by 무위자연 2015. 3. 10. 09:50

1. hex 값이 들어 있는 QbyteArray를 String으로 만들 때

QString temp = QString(tarr.toHex());

QString().sprintf 으로 할려니까 노답.


2. hex값 들이 나열된 string을 int로 바꿀 때

qint64 tvalue = temp.toInt(&ok, 16);

3. Windows의 localtime32로 생성한 데이터를 바이너리 데이터로 저장하고 QT에서 읽어올때

1,2번을 거쳐서 만든 값은 sec 값으로서 해당 값에 1000을 곱해준 다음에 밀리세컨드를 시간으로 변경해주는 함수를 사용한다.

QDateTime datatime = QDateTime::fromMSecsSinceEpoch(tvalue * 1000);

4. 10진수 값을 hex string으로 만들때.

QString::number(temp_number[1], 16)

만일 이 값의 "0"으로 자릿수를 맞추면서 hex로 변환한다고 한다면

QString("%1").arg(temp_number[1], 2, 16, QLatin1Char( '0' )).toUpper()


by 무위자연 2015. 3. 3. 15:42

QObject를 상속 받은 클래스면 구현이 가능하다.


원하는 동작을 정의하고 해당 동작이 SIGNAL로써 call이 되며


해당 함수는 인자를 가질수 있고 그 인자가 SLOT의 input argument가 된다.


이때 주의할 것은 int 같은 기본 형은 그대로 인자로 사용할수 있으나 QJsonObject 와 같은 형태는 레퍼런스(reference)로 넘겨야 한다 그렇지 않을 경우에 하기와 같은 애러가 발생하는데 그 내용이 이것임을 알기가 어렵다.

"invalid use of incomplete type 'class QJsonObject...@ moc_.....cpp

(전체 애러 상황은 첨부파일을 참고 부탁드립니다) 


SIGNAL 시그널 은 "emit" 함수를 통해서 발생시킨다.


이벤트 발생 예.

emit executeCmd(&jsonObject);


헤더 파일 예.

class SLObject : public QObject
{
    Q_OBJECT
public:
    explicit SLObject(QObject *parent = 0);
    ~SLObject();

    void sendCmd(QString cmdStr);

signals:

    void executeCmd(QJsonObject* jobj);


상기와 같이 정의된 클래스를 쓸때는 다음과 같이 사용한다.,

 SLObject *temp = new SLObject(); // 클래스 객체 생성

connect(temp, SIGNAL(executeCmd(QJsonObject*)),this, SLOT(on_test_getuserinfo(QJsonObject*))); // 정의한 시그널을 원하는 슬롯에 connect 한다.

실제 슬롯에서는...

이때 시그널에서 emit한 인자가 슬롯의 input으로 들오옴을 화인할 수 있다.

void UserInformation::on_test_getuserinfo(QJsonObject* json)

{

    // QJsonObject jsonObject = *json;

    ui->userNameEdit->setText((*json)[QString::number(0)].toObject()["user_name"].toString());


19.5.22 추가

QObject를 상속만 받고 class 정의에 "Q_OBJECT"를 추가하지 않으면 다음과 같은 에러가 난다. moc_ 파일 빌드 문제도 아니고 원인을 알기가 어렵다.

에러 Unresolved external symbol on signals



by 무위자연 2015. 2. 25. 14:20
| 1 2 3 |