Я делаю файловый менеджер с открытым исходным кодом с возможностью шифрования и дешифрования файлов / файлов в соответствии с заданным паролем под названием 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 ошибка, так что:
Я не понимаю всего вашего вопроса, но могу дать вам несколько советов.
Ошибка «неоднозначное преобразование» говорит вам, что 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, но это принесет вам лишь небольшую выгоду в вашей текущей ситуации. У вас также нет модели в классической интерпретации, хотя вы можете создать модель, обрабатывающую файловые операции.
Я сделал что-то Это не так просто, как кажется. Я разделил весь код выполнения в новом классе, называемом threadadeController, и с помощью moveToThread переместил его в mainWindow в новый поток. Важно отметить, что этот класс наследует QObject, чтобы иметь возможность использовать механизм сигнального слота, у него нет родителя в конструкторе, потому что в другом случае его нельзя было бы переместить в новый поток. Объекты QWidget не могут быть перемещены в новый поток. Похоже, что связь между потоком GUI и новым потоком может быть выполнена с помощью механизма сигнальных слотов. Qt использует архитектуру Model / View. Каждый может скачать вторую версию исходного кода и exe из Вот.