C++ QFileDialog“;“摧毁”;文件的名称

C++ QFileDialog“;“摧毁”;文件的名称,c++,qt,bioinformatics,fastq,C++,Qt,Bioinformatics,Fastq,现在我正在为一套用于生物信息学的控制台应用程序开发GUI,我正在做我的第一个测试,这是我的第一个使用Qt的项目。我使用QtDesigner来制作GUI,除了QFileDialog将文件名的结尾转换为一个奇怪的字符外,其他一切都可以正常工作,尽管我不确定它是QFileDialog,还是从QString转换为const char 这是我的密码: QString file=QFileDialog::getOpenFileName(this, tr("Open File"),"/home/",tr("A

现在我正在为一套用于生物信息学的控制台应用程序开发GUI,我正在做我的第一个测试,这是我的第一个使用Qt的项目。我使用QtDesigner来制作GUI,除了QFileDialog将文件名的结尾转换为一个奇怪的字符外,其他一切都可以正常工作,尽管我不确定它是QFileDialog,还是从QString转换为const char

这是我的密码:

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);
fastq dump程序结束是因为它说文件名不正确,调试后,我看到文件名从/home/nsg/Downloads/SRR502947.sra变为/home/nsg/Downloads/SRR502947.sra[],有时甚至是/home/nsg/Downloads/SRR5029[]


您知道为什么会发生这种情况或如何修复它吗?

您可以使用Qt的QProcess,而不是使用系统命令来运行外部程序:-

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


如果您不想等待流程完成。由于函数采用QString,因此不需要转换为const char*

您的问题是调用
QString::tostString()
,它返回一个临时对象,并试图获取其内容的指针。当
std::string
被销毁时,指向的内存将变得无效。您根本不需要使用中间
std::string
。这应该起作用:

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

这些方括号是方形ascii字符,不是方括号,我不想把它们粘贴在这里
QString cmdStr =fastqdumpDir + file;
system( qPrintable(cmdStr) );