Qt崩溃/当我使用Qthread::sleep更新进度条时没有出现

Qt crashes/doesn't appear when i use Qthread::sleep to update progress bar

本文关键字:更新 sleep 崩溃 Qthread Qt      更新时间:2023-10-16

我对QT有点陌生,所以我想知道为什么这是无效的:

我有一个进度条,我想通过使用继承QThread的类来更新它。

void mt::run(QProgressBar * asd){
for(int i = 0;i<100;i++){
    asd->setValue(i);
    QThread::sleep(100);
}
}

mt是继承QThread的类。runQProgressBar参数重载。我的主UI线程会像这样发送它的进度条m.run(ui->progressBar);。如果我将删除QThread::sleep(100);,那么它将工作得很好,但我将无法看到增量,因为线程将做得如此之快。但是如果我延迟一点,屏幕就不会出现了

您只能从主线程访问和更新GUI元素。

如果你想在自定义线程中准备一些数据,你应该使用信号/插槽机制将这些数据发送给你的小部件。

下面是一个基本的例子:

class MyThread : public QThread
{
    Q_OBJECT
public:
    MyThread(QObject *parent = 0);
signals:
    void valueChanged(int value);
protected:
    void run();
}
void MyThread::run()
{
    for (int i = 0; i < 100; i++)
    {
        emit valueChanged(i);
        QThread::sleep(100);
    }
}
MyWidget::MyWidget(QWidget *parent) : 
    QWidget(parent)
{
    QHbovLayout *layout = new QHbovLayout(this);
    QProgressBar *pb = new QProgressBar;
    layout->addWidget(pb);
    MyThread *t = new MyThread(this);
    connect(t, SIGNAL(valueChanged(int)), pb, SLOT(setValue(int)));
    t->start();
}
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    // we are in the main thread here, so we can create a widget
    MyWidget w;
    w.show();
    return a.exec();
}
QThread::sleep(100);

你让它睡100秒——这是相当长的一段时间。也许你指的是QThread::msleep(100) ?