簡體   English   中英

新窗口中的QProgressBar不起作用

[英]QProgressBar in new window don't work

當我點擊MainWindow的按鈕時,我正在使用QProgressBar創建新窗口但是當創建新窗口時,QProgressBar在填充循環工作時不會出現。 之后QProgressBar出現並填滿。

構造函數:

ProgressWin::ProgressWin():QWidget()
{
    this->resize(273,98);
    this->move(670, 430);
    bar1 = new QProgressBar(this);
    bar1->setGeometry(20, 31, 251, 31);
    bar1->setMinimum(0);
    bar1->setMaximum(10000);
    this->show();
    unsigned long long secr, PQ;
    unsigned long long rv;
    unsigned long long decr;
    for(int v = 0; v <= 100000; v++) {
            bar1->setValue(v);
    }
}

調用新窗口的按鈕代碼:

void RsaMainWindow::ButtClickCrypt()
{
    FileName1 = ui->LineCrypt->text();
    if(FileName1.isEmpty()) {
        QMessageBox::information(0, "Information", "File for Crypt wasn't chosen");
        return;
    }
    NewWin = new ProgressWin;
}

新窗口類:

class ProgressWin : public QWidget
{
    QProgressBar *bar1;
public:
    ProgressWin();
};

MainWindow的類:

[namespace Ui {
class RsaMainWindow;
}

class RsaMainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit RsaMainWindow(QWidget *parent = 0);
    ~RsaMainWindow();

private slots:
    void ButtClickViewCryp();
    void ButtClickViewDecr();
    void ButtClickViewKeys();
    void ButtClickCrypt();
    void ButtClickDecr();

private:
    Ui::RsaMainWindow *ui;
    QString FileName1;
    QString FileName2;
    QString FileName3;
    ProgressWin *NewWin;

};][1]

用戶界面通常適用於事件循環原則:

While (not closing the app)
    Wait for some event
    update app according event
endWhile

如果在GUI線程中執行繁重的任務,當用戶單擊“執行繁重的任務”時,將調用管理此單擊的代碼,完成后,以下事件將觸發窗口的繪制。 這意味着您的繁重任務將在任務期間凍結用戶界面。

要正確執行繁重的任務,您需要:

  • 創建執行任務的后台線程。 每次迭代,它都會更新任務的一些共享內存(或等效)狀態。 一些UI庫(如QT)允許發送排隊的消息,這有助於這些情況。
  • 在主線程上,在更新狀態時,將進度條設置為新值並返回。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM