Создание дочернего диалога

Модератор: Модераторы разделов

Аватара пользователя
Lostboy
Сообщения: 33
ОС: openSUSE/Mandriva

Создание дочернего диалога

Сообщение Lostboy »

Не знаю с какой стороны подойти к этому вопросу.
Есть приложение, которое отправляет и принимает файлы. В нем есть 1 класс:

Код: Выделить всё

...
class Sender : public QDialog
{
   Q_OBJECT
 public:
 ...
 private slots:
 ...
 private:
 ...
};
#endif


При запуске приложения открывается окно с различными входными данными (имя передаваемого файла, айпи... етц).
Необходимо, чтобы когда программа принимала файл, создавалось новое окно с прогресс баром, который бы показывал уровень загрузки файла и после завершения загрузки закрывалось. Сейчас такой прогресс бар реализован на главном окне, но его необходимо оттуда убрать, ввиду того что одновременно может происходить получение файлов с разных машин, чтобы не было конфликтов - отображение приема каждого файла должно происходить в отдельном окне. Подскажите как это можно реализовать?
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Создание дочернего диалога

Сообщение NickLion »

1) многопоточность - на каждую загрузку - отдельный поток
2) еще один диалог с прогресс баром на каждый поток
т.е. надо наследовать от QThread, перегрузить run - там выполнять загрузку. Диалогу с прогресс баром передавать информацию об изменении.
при необходимости загрузки - создать диалог, новый объект Вашего потока (с указанием соотв. ему диалога и откуда что тащить) и старт ему... все вроде

UPD не, не все, при завершении потока убить диалог.... не напрямую конечно :)
и еще - диалог с прогрессбаром можно пихнуть в тот же поток, где и скачка, но не стоит этого делать...
Спасибо сказали:
Аватара пользователя
Lostboy
Сообщения: 33
ОС: openSUSE/Mandriva

Re: Создание дочернего диалога

Сообщение Lostboy »

1)Многопоточность уже реализована, через pthreads (необходимо пользоваться ими по заданию)
2)В этом и весь вопрос как сделать его?
Пробовал по образу первого класса сделать второй (но облегченный, только с прогрессбаром и лэйблом) и после, через функцию первого класса делать экземпляр второго и запускать его:

Код: Выделить всё

void Sender::func()
{
  SenderChild child;
  child.show();
  child.exec();
}
//попытка сделать экземпляр дочернего класс SenderChild и запустить это окно.

При таком использовании дочернего класса появляется окно, с расположенным на ней прогресс баром и лэйблом, но проблема в том, что я не могу изменить значения ли лэйбла ни прогресс бара, элементарно не смог поменять текст лэйбла. Скажите можно ли вообще так делать и если да, то что я делаю не так.
з.ы. QThread использовать нельзя
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Создание дочернего диалога

Сообщение NickLion »

В общем надо сдлать примерно так:
(делалось на скорую руку, очень скору, да еще и под виндой, поэтому QThread, но суть останется)
архив на самом деле 7z, но расширение рар - иначе не грузит сюда.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Создание дочернего диалога

Сообщение RasenHerz »

Думаю лучше всего сделать список передач (с помощью того же QTreeView). Как можно реализовать;

1) Создаете очередь сообщений (подойдет обычный QList), мьютекс (у нас же многопоточное приложение =) ) и функцию в главном окне, которая добавляет новый элемент в очередь
2) Начинаете создавать потоки передающие файлы
3) Как только поток получит некоторую порцию данных он создает новый элемент очереди (в котором есть вся необходимая информация о передаче) и добавляет его в общую очередь
4) Главное окно по таймеру начинает обрабатывать эту очередь и перерисовывать/добавлять элементы на QTreeView
5) Как только передача закончена главное окно уведомляется о смерти потока и удаляет соответствующую строку из списка передач.
Спасибо сказали: