Russian Qt Forum

Qt => Общие вопросы => Тема начата: 13demon89 от Июль 27, 2010, 14:12



Название: Обращение к командной строке Windows
Отправлено: 13demon89 от Июль 27, 2010, 14:12
вот стандартный диалог выбора файла
void ProgArch::on_zapac_clicked()
{
  QString fileName = QFileDialog::getOpenFileName
Проблема: после нажатия на кнопку открыть, окно закрывается. Далее должно считаться расширение открытого файла и если расширение например exe, то в командной строке винды нужно выполнить 2 команды(перейти в папку, например С:\Program Files\7-Zip и  выполнить вторую, например 7z a archive.zip *exe -mx3). Если же расширение другое - то другие две команды в командной строке Винды. Нужен код, помогите.


Название: Re: Обращение к командной строке Windows
Отправлено: SimpleSunny от Июль 27, 2010, 14:22
Цитировать
Проблема: после нажатия на кнопку открыть, окно закрывается.
Телепатия нынче не в моде.

Код
C++ (Qt)
void ProgArch::on_zapac_clicked()
{
 QString fileName = QFileDialog::getOpenFileName();
 if (fileName.isEmpty())
   return;
 if (getExtension(fileName) == "exe")
   QProcess::execute();
}


Название: Re: Обращение к командной строке Windows
Отправлено: 13demon89 от Июль 27, 2010, 14:27
Где команды то прописать, не буду ж я их в ручную в командной строке прописывать!?


Название: Re: Обращение к командной строке Windows
Отправлено: lit-uriy от Июль 27, 2010, 14:40
Код
C++ (Qt)
bool DocBot::makeHTMLArhive(QString anarhiveName)
{
QTextStream out(stdout);
out.setCodec(outCodec);
QString outString;
 
CurrentPathSwitcher sw(target);
 
// F:/7-Zip/7z.exe a ../Qt_4.4_html_ru.7z *.html
QString cmd = QString("%1 %2 %3")
.arg(arhivecommand)
.arg("../" + anarhiveName)
.arg("*.html");
 
QProcess *process = new QProcess(this);
 
out << "Creat Process:" << cmd << endl;
out.flush();
 
cmd = cmd.toUtf8();
 
process->setProcessChannelMode(QProcess::MergedChannels);
process->start(cmd);
   if (!process->waitForStarted()){
       qDebug() << "Process" << cmd << "may not started";
return false;
}
 
QTime t;
t.start();
 
int sec = 1000; // 1000 ms
int min = 60* sec; // 60 s
int maxtime = 1*min;
 
while(1){
if (process->waitForReadyRead(maxtime)){
outString += QString::fromUtf8(process->readAllStandardOutput().data());
t.restart();
}
if (process->state() != QProcess::Running){
if (process->exitCode() == 0){
qDebug() << "Process" << cmd << "finished ok";
return true;
}else{
out << outString;
out.flush();
qDebug() << "Process" << cmd << "finished with error";
return false;
}
}
if (t.elapsed() >= maxtime){
qDebug() << "Process " << cmd << " may not finished";
return false;
}
}
 
}
из реальной программы. Эта функция создаёт архив из html-файлов. Смысл переменных объявленных за пределами этой функции должен быть очевиден.

На CurrentPathSwitcher можно не обращать внимания. он переключает текущий путь на новый, переданный в его конструктор, а при вызове деструктора (выход из функции) возвращает текущий путь приложения обратно.