2013-09-03 4 views
0

지금은 생물 정보학에 사용되는 콘솔 응용 프로그램 모음에 대한 GUI로 작업 중이며 Qt를 사용하는 첫 번째 프로젝트로 첫 번째 테스트를 수행하고 있습니다. 나는 GUI를 만들기 위해 QtDesigner를 사용하고 있으며, QFileDialog가 QFileDialog 또는 변환인지 알 수는 없지만 QFileDialog가 파일 이름의 끝을 이상한 문자로 변환한다는 것을 제외하면 완벽하게 작동합니다. QStringconst char. 여기 QFileDialog는 파일의 이름을 "파괴"합니다

내 코드입니다 :

QString file=QFileDialog::getOpenFileName(this, tr("Open File"),"/home/",tr("Any file (*.*)")); 
QString fastqdumpDir = "/home/nsg/Downloads/sratoolkit.2.1.16-centos_linux32/bin/" 
fastqdumpDir=fastqdumpDir+"./fastq-dump "; 
QString cmdStr =fastqdumpDir + file; 
const char* command = cmdStr.toStdString().c_str(); 
system(command); 

는 파일 이름이 정확하지 않습니다, 디버깅 후, 나는 파일 이름이 /홈/NSG에서가는 것을 볼 수 있다고 때문에 fastq 덤프 프로그램이 종료//home/nsg/Downloads/SRR502947.sra [] 때로는 /홈으로 다운로드/SRR502947.sra/NSG/다운로드/SRR5029 []

어떻게 해결하는 이런 일 또는 왜 어떤 아이디어를 그것?

+0

그 괄호 평방 ASCII 문자입니다,하지 브래킷, 늘 나를 –

답변

0

오히려 외부 프로그램을 실행하기 위해 시스템 명령을 사용하는 것보다, 당신은 Qt의 QProcess를 사용할 수 있습니다 : -

QString cmdStr = fastqdumpDir + file; 
QProcess::execute(cmdStr); 

또는

QProcess::startDetached(cmdStr) 

당신의 프로세스를 기다리지 않으려면 끝. 함수는 QString을 사용하기 때문에 const char *으로 변환 할 필요가 없습니다.

1

QString::toStdString()은 임시 객체를 반환하고 포인터를 얻기 위해 호출하는 것이 문제입니다. std::string이 삭제되면 가리키는 메모리가 유효하지 않게됩니다. 당신은 중간 std::string 전혀 필요가 없습니다. 이 작동합니다 :

QString cmdStr =fastqdumpDir + file; 
system(qPrintable(cmdStr)); 
+0

너무 감사합니다 여기에 붙여 넣을 수 있도록, 그것을 작동합니다! –