c++ - 新窗口中的 QProgressBar 不起作用

标签 c++ qt new-window qprogressbar

当我单击 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();
};

主窗口类:

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

关于c++ - 新窗口中的 QProgressBar 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39509747/

相关文章:

c++ - 关于从基类到子类指针的向下转型

c++ - 对相对路径进行排序

c++ - 定义静态常量通用唯一标识符(UUID)

c++ - Qt:在新行上分离输入和显示

javascript - 启动一个包含变量或自定义文本输出的新窗口

javascript - 在新窗口中打开谷歌地图反向地理编码

c++ - 如何将 LPCSTR 传递给 C++ 函数转换为字符串并返回 LPCSTR?

c++ - 在 64 位 Linux 上编译 32 位 Qt - fatal error : gnu/lib-names-32. h

android - 将 Android 应用程序部署到手机 : error: [install_itemfolder_01] Error 1 Windows

c# - 获取 WebBrowser.NewWindow 事件的 URL