0

Cryptofmと呼ばれる特定のパスワードに従ってファイルを暗号化および復号化する機能を備えたオープンソースのファイルマネージャーを作成しています。ここからコードを取得できます- 最初のバージョン。Dialog::encAll()プログレスバーが最大値に達してステータスダイアログを閉じた後、スロットのプログレスバーでロード画面を表すステータスダイアログを追加したいと思います。最初に、フォルダー内のすべてのファイルの合計サイズを再帰的に見つける必要があることがわかりました(TreeViewコンテキストメニューオプションのサイズで)-スロットDialog::dirSize()は関数の助けを借りてこれを行っていますDialog::getSelectedTreeItemSize()をクリックし、プログレス バー プロパティの最大値をその値に設定します。合計サイズの計算プロセスには再び多くの時間がかかる可能性があるため、プロセスが実行中であることを示すために何かが動いている別のダイアログが必要です。全体は、Windows 7 で大量のファイルを含む非常に大きなフォルダーを貼り付けるプロセスのようなものでなければなりません。

合計サイズを取得するプロセス:

ここに画像の説明を入力

プログレスバーが合計サイズに達するまで貼り付けるプロセス:

ここに画像の説明を入力

問題は、ほとんどすべての関数、アクションなどがDialogクラスに実装されており、スレッドを使用できないことですDialog : public QDialog, public QThread.dialog.hにこのようなQThreadを追加した後(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' のあいまいなアクセスは、ベース 'QObject' の 'connect' であるか、ベース 'QObject' の 'connect' である可能性があります

さらに 31 個のエラーがあるため、次のようになります。

  • ここで最良の選択肢は何ですか?
  • MVC または別のパターンを使用する必要がありますか?
  • スレッドを使用する必要がありますか?
4

2 に答える 2

2

質問のすべてを理解することはできませんが、いくつかのヒントを与えることができます。

「あいまいな変換」というエラーは、C++ が に変換できないことを示していDialog* constますQObject*。通常、この問題は のようなキャストを使用して解決できますQObject* o = (QObject*) dialogconstまた、オブジェクトへのポインターを非オブジェクトへのポインターに変換しようとしconstます。constオブジェクトは変更から保護されていますが、非オブジェクトは保護されていないため、これはconst不可能です。const修飾子を削除するか、 QObject*.

最初のスクリーンショットのプログレス バーの動作は、「不確定モード」と呼ばれることがよくあります。最小値と最大値を 0 に設定することで、QProgressBar でこの動作を実現できます (pbar->setMaximum(0)と を使用pbar->setMinimum(0))。

スレッドに関する質問については、はい、ワーカー スレッドを使用してファイルをコピーする必要があります。UI スレッド (おそらく現在のソリューションで使用している) を使用する際の問題は、UI がユーザー入力 (ウィンドウの移動やボタンの押下など) に対する応答を停止し、QProgressBar などの UI 要素が更新されない可能性があることです。その進行状況はユーザーには表示されません。QThread を間違った方法で yout プログラムに追加しました。現在、カスタム Dialog クラスを QDialog (これまでのところ問題ありません) および QThread (これが問題です) から継承しています。QThread から継承する代わりに、新しい QThread インスタンスを作成し、newそれを使用してメソッドを呼び出す必要があります。オンラインでたくさんの例を見つけることができます。

MVC を使用することもできますが、現在の状況では少ししかメリットがありません。また、ファイル操作を処理するモデルを作成することはできますが、古典的な解釈にはモデルがありません。

于 2015-11-16T08:42:04.080 に答える
0

私は何かをしました。見た目ほど簡単ではありません。すべての実行コードを threadedController という新しいクラスに分離し、moveToThread を使用して mainWindow 内のコードを新しいスレッドに移動しました。シグナルスロットメカニズムを使用できるようにするために、このクラスは QObject を継承していることに注意することが重要です。コンストラクターには親がありません。それ以外の場合は新しいスレッドに移動できないためです。QWidget オブジェクトを新しいスレッドに移動することはできません。GUI スレッドと新しいスレッド間の通信は、シグナルスロット機構によって行うことができるようです。Qt はモデル/ビュー アーキテクチャを使用しています。誰でもここから第 2 版のソースと exe をダウンロードできます。

于 2015-11-25T16:52:53.863 に答える