C++ 新窗口中的QProgressBar don';行不通

C++ 新窗口中的QProgressBar don';行不通,c++,qt,new-window,qprogressbar,C++,Qt,New Window,Qprogressbar,当我点击主窗口的按钮时,我正在用QProgressBar创建新窗口,但当创建新窗口时,填充周期工作时,QProgressBar不会出现。然后QProgressBar出现并填充 建造商: ProgressWin::ProgressWin():QWidget() { this->resize(273,98); this->move(670, 430); bar1 = new QProgressBar(this); bar1->setGeometry(

当我点击主窗口的按钮时,我正在用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();
};
主窗口的类:

[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,允许发送排队消息,这对这些情况很有帮助
  • 在主线程上,更新状态时,将进度条设置为新值并返回

用户界面通常根据事件循环原则工作:

While (not closing the app)
    Wait for some event
    update app according event
endWhile
如果在GUI线程中实现繁重的任务,当用户单击“执行繁重的任务”时,将调用管理此单击的代码,完成后,以下事件将触发窗口的绘制。这意味着繁重的任务将在任务期间冻结用户界面

要正确执行繁重的任务,您需要:

  • 创建执行任务的后台线程。每次迭代,它都会更新任务的一些共享内存(或等效内存)状态。一些UI库,比如QT,允许发送排队消息,这对这些情况很有帮助
  • 在主线程上,更新状态时,将进度条设置为新值并返回

如果在for循环中填充进度条,而该循环不会将控制权返回GUI进行更新,那么为什么您希望进度条会明显填充?您应该更熟悉GUI,并了解事件处理循环等。如果在for循环中填充进度条,为什么您希望进度条会明显填充对于不将控制权返回到GUI以进行更新的循环,您应该更加熟悉GUI,并阅读有关事件处理循环等的内容。