Russian Qt Forum
Ноябрь 24, 2024, 08:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: вопрос о QTextBrowser  (Прочитано 6318 раз)
inforse
Гость
« : Октябрь 11, 2012, 19:17 »

Подскажите пожалуйста, вот такая ситуация.

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

Там насколько я понял разность типов идет, в Приложении выводится QByteArray, он не совместим с TextBrowser.
Есть какие нибудь стандартные варианты Qt что бы перехватить вывод приложения и вывести его пользователю?
Записан
mutineer
Гость
« Ответ #1 : Октябрь 11, 2012, 20:04 »

Да, используй QProcess для запуска
Записан
inforse
Гость
« Ответ #2 : Октябрь 11, 2012, 20:27 »

А можно по подробнее, пожалуйста.
Qprocess можно вывести в текстБраузер?
Записан
mutineer
Гость
« Ответ #3 : Октябрь 11, 2012, 20:33 »

Почитай документацию. Если запускаешь процесс через QProcess, то можно читать его вывод и делать с этим выводом что хочешь
Записан
andrew.k
Гость
« Ответ #4 : Октябрь 11, 2012, 20:33 »

А можно по подробнее, пожалуйста.
Подробнее можно - подробнее написано в ассистенте  Подмигивающий
Записан
inforse
Гость
« Ответ #5 : Октябрь 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!)
Записан
andrew.k
Гость
« Ответ #6 : Октябрь 16, 2012, 09:45 »

Так спасибо за наводку, Qprocess почитал, перевел на него системную команду, он её выполняет. Только теперь тишина на
Ну как же ты почитал?

Это самые последние, пытался конект сделать с ReadyreadStandardOutput (connect( process, SIGNAL(readyReadStandardOutput()), SLOT(slotDataOnStdout()))Подмигивающий Но при компиляции он ему не нравится, и я не знаю почему. Примеры в книгах не адаптируются((
Help!)
С коннектом сигналов, будь другом, разберись сам. Поверь, они коннектятся.
« Последнее редактирование: Октябрь 16, 2012, 09:47 от andrew.k » Записан
mutineer
Гость
« Ответ #7 : Октябрь 16, 2012, 10:12 »

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

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

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

ты в первой строке уже все прочитал, во второй читать уже нечего
Записан
inforse
Гость
« Ответ #8 : Октябрь 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, то все сообщения видны.
Только не ругайтесь если достал уже) Пожалуйста)
Записан
mutineer
Гость
« Ответ #9 : Октябрь 16, 2012, 12:29 »

процесс пишет свои сообщения в standartOutput или в standartError?
Записан
inforse
Гость
« Ответ #10 : Октябрь 16, 2012, 13:45 »

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

сам процесс в standart должен писать.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.21 секунд. Запросов: 20.