Добавить диалог статуса в проект Qt

Я делаю файловый менеджер с открытым исходным кодом с возможностью шифрования и дешифрования файлов / файлов в соответствии с заданным паролем под названием Cryptofm. Вы можете получить код от Вот — первая версия. Я хочу добавить диалог состояния, представляющий экран загрузки с индикатором выполнения для Dialog::encAll() слот, после того, как индикатор выполнения достигнет максимального значения, чтобы закрыть диалог состояния. Я обнаружил, что сначала я должен рекурсивно найти общий размер всех файлов в папке (в опции контекстного меню TreeView Размер) — слот Dialog::dirSize() делает это с помощью функции Dialog::getSelectedTreeItemSize(), а затем установите максимальное значение свойства индикатора выполнения на это значение. Процесс вычисления общего размера может снова занять много времени, поэтому мне нужно еще одно диалоговое окно с чем-то движущимся, чтобы просто указать, что процесс выполняется. Все это должно быть чем-то вроде процесса вставки очень большой папки с большим количеством файлов в Windows 7.

Процесс получения общего размера:

введите описание изображения здесь

Процесс вставки до тех пор, пока индикатор выполнения не достигнет общего размера:

введите описание изображения здесь

Проблема в том, что почти все функции, действия и т. Д. Реализованы в классе Dialog, и я не могу использовать потоки — после добавления QThread вот так Dialog : public QDialog, public QThread в dialog.h (чтобы реализовать метод run ()) программа выдает несколько ошибок:

C: \ Users \ niki \ Documents \ EncryptionProject \ dialog.cpp: 41: ошибка: C2594:
‘аргумент’: неоднозначные преобразования из ‘Dialog * const’ в ‘QObject

C: \ Users \ niki \ Documents \ EncryptionProject \ dialog.cpp: 46: ошибка: C2594:
‘аргумент’: неоднозначные преобразования из ‘Dialog * const’ в ‘QObject

C: \ Users \ niki \ Documents \ EncryptionProject \ dialog.cpp: 51: ошибка: C2385:
неоднозначный доступ ‘connect’ может быть ‘connect’ в базе ‘QObject’
или может быть «подключиться» в базе «QObject»

И еще 31 ошибка, так что:

  • Каковы лучшие варианты здесь?
  • Должен ли я использовать MVC или другой шаблон?
  • Должен ли я использовать темы?

0

Решение

Я не понимаю всего вашего вопроса, но могу дать вам несколько советов.

Ошибка «неоднозначное преобразование» говорит вам, что C ++ не может преобразовать Dialog* const в QObject*, Обычно вы можете решить эту проблему, используя приведение типа QObject* o = (QObject*) dialog, Вы также пытаетесь преобразовать указатель в const объект указатель на неconst объект. Это невозможно, так как const объекты защищены от изменений, тогда какconst объектов нет. Попробуйте удалить const квалификатор или добавить его в QObject*,

Поведение индикатора выполнения на первом скриншоте часто называют «неопределенным режимом». Вы можете добиться этого поведения с QProgressBar, установив минимальное и максимальное значения в 0 (используйте pbar->setMaximum(0) а также pbar->setMinimum(0)).

Что касается вашего вопроса о потоках: Да, вы должны использовать рабочий поток для копирования файлов. Проблема с использованием UI-потока (который вы, вероятно, используете в своем текущем решении) заключается в том, что пользовательский интерфейс прекратит повторное кодирование для ввода данных пользователем (например, перемещение окна или нажатие кнопки), а элементы UI, такие как QProgressBar, могут не обновляться. и ваш прогресс для этого не виден пользователю.
Вы неправильно добавили QThread в свою программу. В настоящее время вы унаследовали свой пользовательский класс Dialog от QDialog (пока все хорошо) и от QThread (вот в чем проблема). Вместо того, чтобы наследовать от QThread, вы должны создать новый экземпляр QThread с new а затем вызвать метод с ним. Вы найдете множество примеров в Интернете.

Вы можете использовать MVC, но это принесет вам лишь небольшую выгоду в вашей текущей ситуации. У вас также нет модели в классической интерпретации, хотя вы можете создать модель, обрабатывающую файловые операции.

2

Другие решения

Я сделал что-то Это не так просто, как кажется. Я разделил весь код выполнения в новом классе, называемом threadadeController, и с помощью moveToThread переместил его в mainWindow в новый поток. Важно отметить, что этот класс наследует QObject, чтобы иметь возможность использовать механизм сигнального слота, у него нет родителя в конструкторе, потому что в другом случае его нельзя было бы переместить в новый поток. Объекты QWidget не могут быть перемещены в новый поток. Похоже, что связь между потоком GUI и новым потоком может быть выполнена с помощью механизма сигнальных слотов. Qt использует архитектуру Model / View. Каждый может скачать вторую версию исходного кода и exe из Вот.

0

По вопросам рекламы [email protected]