Прямо сейчас я работаю над графическим интерфейсом для набора консольных приложений, используемых для биоинформатики, и я делаю свои первые тесты в качестве моего первого проекта с использованием Qt. Я использую QtDesigner для создания графического интерфейса, и все работает отлично, за исключением того, что 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 [] а иногда даже / Главная / NSG / Загрузки / SRR5029 []
Есть идеи, почему это происходит или как это исправить?
Ваша проблема в том, что вы звоните QString::toStdString()
, который возвращает временный объект и пытается получить указатель на его содержимое. Указанная память становится недействительной, поскольку std::string
уничтожен Вам не нужно промежуточного std::string
совсем. Это должно работать:
QString cmdStr =fastqdumpDir + file;
system( qPrintable(cmdStr) );
Вместо того, чтобы использовать системную команду для запуска внешней программы, вы можете использовать Qtcess Qt: —
QString cmdStr = fastqdumpDir + file;
QProcess::execute(cmdStr);
или же
QProcess::startDetached(cmdStr)
если вы не хотите ждать окончания процесса. Так как функции принимают QString, нет необходимости в преобразовании в const char *