QT的QProgressDialog類的使用

it_xiangqiang發表於2020-12-20

詳細說明
QProgressDialog類提供有關緩慢操作進度的反饋。

進度對話方塊用於向使用者指示操作將花費多長時間,並演示應用程式尚未凍結。它還可以使使用者有機會中止該操作。
進度對話方塊的一個常見問題是很難知道何時使用它們。操作在不同的硬體上花費的時間不同。 QProgressDialog提供瞭解決此問題的方法:它估算操作將花費的時間(基於步驟的時間),並且僅在估算值超過minimumDuration()(預設為4秒)時才顯示自身。
使用setMinimum()和setMaximum()或建構函式來設定操作中的“步數”,並在操作進行時呼叫setValue()。步數可以任意選擇。它可以是複製的檔案數,接收的位元組數,通過演算法主迴圈的迭代數或其他合適的單位。進度從setMinimum()設定的值開始,並且進度對話方塊顯示,當您使用setMaximum()設定的值作為引數呼叫setValue()時,操作已完成。
該對話方塊會在操作結束時自動重置並隱藏。使用setAutoReset()和setAutoClose()更改此行為。請注意,如果您設定了一個新的最大值(使用setMaximum()或setRange()),該最大值等於當前的value(),則對話方塊將不會關閉。
有兩種使用QProgressDialog的方法:模態和無模。
與無模式QProgressDialog相比,模式QProgressDialog對程式設計師而言更簡單。迴圈執行該操作,每隔一段時間呼叫setValue(),然後使用wasCanceled()檢查取消。例如:

 QProgressDialog progress("Copying files...", "Abort Copy", 0, numFiles, this);
      progress.setWindowModality(Qt::WindowModal);

      for (int i = 0; i < numFiles; i++) {
          progress.setValue(i);

          if (progress.wasCanceled())
              break;
          //... copy one file
      }
      progress.setValue(numFiles);

無模式進度對話方塊適用於在後臺進行的操作,使用者可以在其中與應用程式進行互動。這樣的操作通常基於QTimer(或QObject :: timerEvent())或QSocketNotifier。或在單獨的執行緒中執行。主視窗狀態列中的QProgressBar通常是無模式進度對話方塊的替代方法。
您需要執行一個事件迴圈,將canceled()訊號連線到停止該操作的插槽,然後間隔呼叫setValue()。例如:

// Operation constructor
  Operation::Operation(QObject *parent)
      : QObject(parent), steps(0)
  {
      pd = new QProgressDialog("Operation in progress.", "Cancel", 0, 100);
      connect(pd, SIGNAL(canceled()), this, SLOT(cancel()));
      t = new QTimer(this);
      connect(t, SIGNAL(timeout()), this, SLOT(perform()));
      t->start(0);
  }

  void Operation::perform()
  {
      pd->setValue(steps);
      //... perform one percent of the operation
      steps++;
      if (steps > pd->maximum())
          t->stop();
  }

  void Operation::cancel()
  {
      t->stop();
      //... cleanup
  }

在這兩種模式下,可以通過使用setLabel(),setBar()和setCancelButton()將子小部件替換為自定義小部件來定製進度對話方塊。函式setLabelText()和setCancelButtonText()設定顯示的文字。
在這裡插入圖片描述

相關文章