0

现在我正在为一套用于生物信息学的控制台应用程序开发一个 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[]

任何想法为什么会发生这种情况或如何解决它?

4

2 回答 2

1

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

QString cmdStr =fastqdumpDir + file;
system( qPrintable(cmdStr) );
于 2013-09-03T16:32:35.397 回答
0

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

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

或者

QProcess::startDetached(cmdStr)

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

于 2013-09-03T16:29:39.920 回答