Russian Qt Forum

Qt => Вопросы новичков => Тема начата: inforse от Октябрь 11, 2012, 19:17



Название: вопрос о QTextBrowser
Отправлено: inforse от Октябрь 11, 2012, 19:17
Подскажите пожалуйста, вот такая ситуация.

В приложении выполняю команду стандартным оператором system().
В Creatore в окне Вывод приложения выводятся все сообщения выполняющиеся этой командой.
Можно ли их перехватить и выводить в реальном времени в TextBrowser?

Там насколько я понял разность типов идет, в Приложении выводится QByteArray, он не совместим с TextBrowser.
Есть какие нибудь стандартные варианты Qt что бы перехватить вывод приложения и вывести его пользователю?


Название: Re: вопрос о QTextBrowser
Отправлено: mutineer от Октябрь 11, 2012, 20:04
Да, используй QProcess для запуска


Название: Re: вопрос о QTextBrowser
Отправлено: inforse от Октябрь 11, 2012, 20:27
А можно по подробнее, пожалуйста.
Qprocess можно вывести в текстБраузер?


Название: Re: вопрос о QTextBrowser
Отправлено: mutineer от Октябрь 11, 2012, 20:33
Почитай документацию. Если запускаешь процесс через QProcess, то можно читать его вывод и делать с этим выводом что хочешь


Название: Re: вопрос о QTextBrowser
Отправлено: andrew.k от Октябрь 11, 2012, 20:33
А можно по подробнее, пожалуйста.
Подробнее можно - подробнее написано в ассистенте  ;)


Название: Re: вопрос о QTextBrowser
Отправлено: inforse от Октябрь 16, 2012, 09:12
Так спасибо за наводку, Qprocess почитал, перевел на него системную команду, он её выполняет. Только теперь тишина на выходе.. Тоесть работу он делает но никаких сообщений не выводит.
Подскажите пожалуйста, очень надо что делать. Брал примеры из книжек, ни фига не получается. Вот несколько вариантов которые я пробовал.
Код:
QProcess m_process;
QByteArray p;

m_process.start(dump);
p = m_process.readAll();
ui->textBrowser->append(m_process.readAllStandardOutput());
Код:
QByteArray d2;
QProcess process;

    process.start(dump);

    if (process.waitForFinished() == true)
    {
        d2 = process.readAll().data();
        textBrowser->insertPlainText(process.readAll().data());
Это самые последние, пытался конект сделать с ReadyreadStandardOutput (connect( process, SIGNAL(readyReadStandardOutput()), SLOT(slotDataOnStdout()));) Но при компиляции он ему не нравится, и я не знаю почему. Примеры в книгах не адаптируются((
Help!)


Название: Re: вопрос о QTextBrowser
Отправлено: andrew.k от Октябрь 16, 2012, 09:45
Так спасибо за наводку, Qprocess почитал, перевел на него системную команду, он её выполняет. Только теперь тишина на
Ну как же ты почитал (http://doc.qt.digia.com/qt/qprocess.html#readAllStandardOutput)?

Это самые последние, пытался конект сделать с ReadyreadStandardOutput (connect( process, SIGNAL(readyReadStandardOutput()), SLOT(slotDataOnStdout()));) Но при компиляции он ему не нравится, и я не знаю почему. Примеры в книгах не адаптируются((
Help!)
С коннектом сигналов, будь другом, разберись сам. Поверь, они коннектятся.


Название: Re: вопрос о QTextBrowser
Отправлено: mutineer от Октябрь 16, 2012, 10:12
Это самые последние, пытался конект сделать с ReadyreadStandardOutput (connect( process, SIGNAL(readyReadStandardOutput()), SLOT(slotDataOnStdout()));) Но при компиляции он ему не нравится, и я не знаю почему. Примеры в книгах не адаптируются((
Help!)

Если почитать внимательно сообщение об ошибке, то можно заметить, что process не указатель

d2 = process.readAll().data();
textBrowser->insertPlainText(process.readAll().data());

ты в первой строке уже все прочитал, во второй читать уже нечего


Название: Re: вопрос о QTextBrowser
Отправлено: inforse от Октябрь 16, 2012, 11:51
Код:
ui->setupUi(this);
    connect(&mprocess, SIGNAL(readyReadStandardOutput()), this, SLOT(updateOutputTextEdit()));
    connect(&mprocess, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(processFinished(int,QProcess::ExitStatus)));
    connect(&mprocess, SIGNAL(error(QProcess::ProcessError)), this, SLOT(processError(QProcess::ProcessError)));
    ss();
Код:
void process::ss()
{
    mprocess.start("Dump");
}
Код:
void process::updateOutputTextEdit()
{
    QByteArray newData = mprocess.readAllStandardOutput();
    QString text = ui->textEdit->toPlainText() + QString::fromLocal8Bit(newData);
    ui->textEdit->setPlainText(text);
}

void process::processFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
    if (exitStatus == QProcess::CrashExit)
    {
        ui->textEdit->append(tr("Crash"));
    }   else if (exitCode != 0) {
        ui->textEdit->append(tr("Faild"));
    }   else {
        ui->textEdit->append(tr("File create"));
    }
}

void process::processError(QProcess::ProcessError error)
{
    if (error == QProcess::FailedToStart)
    {
        ui->textEdit->append(tr("Faild to start"));
    }

Хорошо, тогда вопрос по существу. Вот этот код полность рабочий, и ошибки считывает, и результат завершения процесса выводит замечательно. Почему он даже не заходит в слот updateOutputTextEdit? Что я не так делаю? Он запускает процесс, но сообщения которые он выводит, он не видит. Если запустить тот же процесс через system, то все сообщения видны.
Только не ругайтесь если достал уже) Пожалуйста)


Название: Re: вопрос о QTextBrowser
Отправлено: mutineer от Октябрь 16, 2012, 12:29
процесс пишет свои сообщения в standartOutput или в standartError?


Название: Re: вопрос о QTextBrowser
Отправлено: inforse от Октябрь 16, 2012, 13:45
Если процесс запустить не удается, он пишет в Error, после выполнения выводит результат через Finished.
Пробовал этот код:
Код:
QByteArray newData = mprocess.readAllStandardOutput();
QString text = ui->textEdit->toPlainText() + QString::fromLocal8Bit(newData);
ui->textEdit->setPlainText(text);
сразу вставить после запуска процесса, и прочитать переменную text. Она пустая. Я не понимаю почему он сообщения запущенные системной командой не видит. Он даже в случае ошибки, все равно должен писать в Text все что система даёт.
На деле реакция на ошибки, и отсутствия файлов она обрабатывает, но сообщения у меня не получается отловить.


Название: Re: вопрос о QTextBrowser
Отправлено: inforse от Октябрь 16, 2012, 13:46
сам процесс в standart должен писать.