윈플

error: conversion from ‘uint64_t {aka long unsigned int}’ to ‘QVariant’ is ambiguous

또는 Conver int64 to QVariant 관련 이슈


> int64 변수를 QVariant 형으로 반환할려고 할 때 위 에러가 발생.


참고 링크 : https://stackoverflow.com/questions/24260034/how-to-convert-an-unsigned-long-int-to-qvariant
위 URL를 보면 오직 long 타입에서 해당 문제가 발생한다고 하는데... 암튼 해결책이 필요했다.


구글링을 좀 더 열심히 해본 결과!

QVariant::fromValue( 변수 ); 을 통해 해결


http://doc.qt.io/qt-5/qvariant.html

여기에서 fromValue 에 대한 좀 더 자세한 설명을 확인 가능.


Comment +0

<상황>

QT Creator(4.1.0)가 업데이트된지는 오래되었는데 귀찮아서 미루다 미루다 결국 재설치를 하였습니다.
예전에 만들어놓은 프로젝트를 새로 설치한 QT Creator에서 열어서 확인을 하는 중에 기존에 사용 중이던 Header를 제대로 읽지 못 하는 문제가 있었습니다.


Compile, Run 하는데 문제는 없지만 코드를 짤 때 자동완성 기능을 사용할 수 없는 치명적인 문제!


ex)

#include <QDialog>
#include <QWidget>

이런 기본적인 Header 파일들조차 인식하지 않아서 여러가지 시도를 해보다가,
새로운 프로젝트를 하나 생성 후에 확인 해보니 또 제대로 작동이 되어서 차이점을 찾는 중에 .pro 파일에서 차이점을 찾았습니다.

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

기존 프로젝트 .pro 파일에는 없는 한 줄이 새롭게 만들어진 프로젝트 .pro 파일에 있었는데요 


제가 Qt-4에서 작업 중이 었기 때문에 새롭게 설치한 Qt-5에서 해당 헤더파일들을 제대로 가져오지 못 해서 문제가 발생한 것으로 보여집니다.
Qt-5 Doc : http://doc.qt.io/qt-5/gettingstartedqt.html 에서 확인해도 같은 줄이 들어가 있습니다.



1) 직적 Qt 버전을 설정해주는 방법

QT_VERSION = 5   # this can be 4, set manually

equals(QT_VERSION, 5){
   QT += widgets
}
equals(QT_VERSION, 4) {
   QT += gui
}

2) 자동으로 Qt 버전을 설정하는 방법

greaterThan(QT_MAJOR_VERSION, 4) {
    QT += widgets
} 

참고한 URL : http://stackoverflow.com/questions/18663331/how-to-check-the-selected-version-of-qt-in-a-pro-file



결과적으로 위 두 방법 또는 Qt-5 공식 사이트에서 적혀있는


greaterThan(QT_MAJOR_VERSION, 4): QT += widgets


한 줄을 문제가 발생한 프로젝트의 .pro 파일에 추가한다면 이제 자동완성 기능을 사용하실 수 있습니다. 
(정상적으로 헤더파일을 읽을 수 있기 때문에...)
Success.


Comment +0

QString을 사용하면서 많이 사용되었던 부분들 정리합니다.
계속 추가해 나가겠습니다.


1. QString conver to char*

: 작업할 때 은근히 C라이브러리들이 많아서 C소스에서 QT로 사용할 때 또는 반대로, QString를 char* 로 변환하는 경우가 빈번히 발생
 QString의 자체 함수만으로는 제대로 안 되는 경우가 발생해서 찾아봤습니다.

- QString 의 자체 함수를 사용하는 방식

QString qstrTest = "test";
char *chrTest = qstrTest.toStdString().c_str();


- QByteArray를 사용하는 방식(1)

QString qstrTest = "test";
QByteArray byteArray = qstrTest.toUtf8();
const char *chrTest = byteArray.constData();


- QByteArray를 사용하는 방식(2) 

QString qstrTest = "test";
QByteArray byteArray = qstrTest.toLocal8Bit();
char *chrTest = byteArray.data();

참고 URL : http://doc.qt.io/qt-4.8/qstring.html
Keyword : Converting Between 8-Bit Strings and Unicode Strings

 QString provides the following four functions that return a const char * version of the string as QByteArraytoAscii(),toLatin1(), toUtf8(), and toLocal8Bit().

  • toAscii() returns an 8-bit string encoded using the codec specified by QTextCodec::codecForCStrings (by default, that is Latin 1).
  • toLatin1() returns a Latin-1 (ISO 8859-1) encoded 8-bit string.
  • toUtf8() returns a UTF-8 encoded 8-bit string. UTF-8 is a superset of US-ASCII (ANSI X3.4-1986) that supports the entire Unicode character set through multibyte sequences.
  • toLocal8Bit() returns an 8-bit string using the system's local encoding.

To convert from one of these encodings, QString provides fromAscii(), fromLatin1(), fromUtf8(), and fromLocal8Bit(). Other encodings are supported through the QTextCodec class. 


2. QString 에 들어있는 문자열의 라인수 확인하기

: 파일에 있는 데이터 또는 여러 문자열을 합치는 경우 등 QString 안에 있는 문자열의 Line 수를 체크할 필요가 있을 때 사용


- QStringList 와 split를 활용한 콤비네이션!

QString qstrTest = readFile(Path);                    // 특정 함수를 통해 파일을 읽어들인다고 가정 QStringList qstrList_Lines = qstrTest.split('\n');    // QStringList 를 통해 '\n' 기준으로 위에서 읽어들인 문자열을 자릅니다! qDebug() << qstrTest;                                 // 문자열 확인 qDebug() << "Count : " << qstrList_Lines.count();     // '\n' 으로 제대로 잘려져있는지 확인

for(int i=0; i<qstrList_Lines.count(); i++)

{

qDebug() << "[" + i + "] " + qstrList_Lines.at(i);         // 기존 문자열과 비교해보기

}



Comment +1

리눅스 + QT로 코딩을 할 때, 아무생각 없이 파일 관련된 부분들을 다 .sh 파일로 만들어서 구현을 했습니다.
system()을 사용하면 결과값을 알 수 없기 때문에 QProcess 를 사용해서 .sh 스크립트로 결과값 받는 방식

일단 system()을 너무 많이 사용하는 것도 좋은건 아니지만 무엇보다 파일이 단순히 있는지 없는지 확인할 때,

ls, ll + grep 명령어를 통해 확인하는 방법보다는 access() 또는 qt에서 제공하는 라이브러리를 사용하는 방식이 더 좋다고 합니다.
( ls, ll + grep을 통해 확인 시에는 해당 파일의 쓸데없는 정보까지 얻어오는 과정이 포함되기 때문에 ... )


예를들어 /home/file.txt 파일을 확인합니다.

1. access() 

if( 0==access("/home/file.txt",0))
{
       qDebug() << "existed";


2. QFile을 사용한 방법

QFile file("/home/file.txt"); 

if( file.exists() )
{
       qDebug() << "existed";       


파일 삭제도
rm 명령어를 쉘스크립트로 사용하는 방법보다는 자체 라이브러리를 사용하자.

if( file.remove() )
{
       qDebug() << "removed";
}


기억용으로다가 정리.

Comment +0