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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: вопрос о QTextBrowser  (Прочитано 6562 раз)
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]   Вверх
  Печать  
 
Перейти в:  


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