qt子线程无法直接操作ui,需要发信号到主线程

需求是在数据加载的时候显示等待动画,加载结束关闭动画。

            QWidget *qw = new QWidget(w);
            qw->setFixedSize(125,80);

            QProgressIndicator *pgi= new QProgressIndicator(qw);
            pgi->setColor(QColor(9, 126, 186));
            //text
            QLabel *label = new QLabel(qw);
            label->setText(u8"数据正在加载中");
            label->setAlignment(Qt::AlignLeft);

            //设置布局
            QVBoxLayout *hLayout = new QVBoxLayout(this);
            hLayout->setMargin(0);
            hLayout->addWidget(pgi);
            hLayout->addWidget(label);
            hLayout->setAlignment(pgi, Qt::AlignCenter);
            qw->setLayout(hLayout);


            //设置位置
            int x = (w->width() - qw->width()) / 2;
            int y = (w->height() - qw->height()) / 2;
            qw->move(x, y);
            qw->show();

            QFutureWatcher<void> *pwatcher = new QFutureWatcher<void>;
            pgi->startAnimation();
            //执行耗时任务
            QFuture<void> future = QtConcurrent::run([=]() {
                w->readRawFolder(str);
            });

            connect(pwatcher, &QFutureWatcher<void>::finished, this, [=]() {
                pgi->stopAnimation();
                qw->hide();
                delete qw;
                delete pwatcher;
            });

            pwatcher->setFuture(future);

这样导致我主界面有些操作无法正常运行了。

QObject::connect: Cannot queue arguments of type 'QVector<int>'

(Make sure 'QVector<int>' is registered using qRegisterMetaType().)QBasicTimer::start: Timers cannot be started from another thread

QObject::setParent: Cannot set parent, new parent is in a different thread

控制台会打印这些东西。

问了问别人是,qt子线程无法直接操作ui,需要发信号到主线程,也就是ui线程。

#qt##多线程#
全部评论

相关推荐

1 1 评论
分享
牛客网
牛客企业服务