crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QProcess+QProgressBar
Kokos
  опции профиля:
сообщение 18.6.2015, 21:47
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 18.6.2015
Пользователь №: 4409

Спасибо сказали: 0 раз(а)




Репутация:   0  


Кому не трудно подскажите пожалуйста.
Решил сделать интерфейс для консольной программки на bash, в с++ не разбираюсь, но с помощью Qt Creator сделал форму, пару кнопок.
Есть скрипт который долго работает, хотел вывести статус его выполнения через QProgressBar, но не соображу как это сделать.

Пока код такой:
#include "widget.h"
#include "ui_widget.h"
#include <QProcess>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_2_clicked()
{
    QProcess process(this);
    process.startDetached("/opt/tall/ttings.sh");
}

void Widget::on_progressBar_valueChanged(int value)
{


}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 19.6.2015, 14:21
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


Через QProcess никак,
если только выполнение вашего скрипта не возвращает в аутпут процесса значение прогресса выполнения.

если же там простой скрипт состоящий построчно из команд, без циклов и тп фишек.
то этот файл можно выполнить последовательно, построчно.
Тогда все выглядит довольно просто:
1. Читается файл скрипта построчно, заполняется массив со строками
2. Потом последовательно выполняется через QtConcurrent::mappedReduced например
3. Используется QFutureWatcher для мониторинга процесса исполнения, который подключается к полосе прогресса.

Сообщение отредактировал wiz29 - 19.6.2015, 14:22
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kokos
  опции профиля:
сообщение 20.6.2015, 13:51
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 18.6.2015
Пользователь №: 4409

Спасибо сказали: 0 раз(а)




Репутация:   0  


Если я проставлю в скрипте метки типа echo "progress=1" echo "progress=3"... как их читать и заставить progressBar сопоставлять их со своей шкалой?

Вчера весь день изучал документацию, но без наглядных примеров правильно сделать не получается, да и неправильно тоже.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 25.6.2015, 11:25
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


Все просто: процесс - это QIODevice.
Вкратце можно запустить его в отдельном потоке и через прокси объект нотифицировать о ходе прогресса или об ошибка, читая из него данные.

// поточная функция которую можно запустить используя метод QtConcurrent::run(ProcessExecutor, execData); например, из слота в главном потоке.
void ProcessExecutor(const ExecutionData& execData)
{
    // запускаем процесс.
    QProcess process;
    process.start(execData.processName, execData.args);
    if (process.waitForStarted())
    {
        QByteArray processData;
        while(process.waitForReadyRead())
        {
            processData.append(process.readAll());
            //добавить код для обработки текущего буфера данных от процесс.
            .................................
            //отправить нотификацию в основной поток через прокси объект.
            execData.proxyObject.sendNotification(value);
        }
    }
}


Сообщение отредактировал wiz29 - 25.6.2015, 11:27
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 18.4.2024, 17:54