【发布时间】:2015-05-06 12:46:07
【问题描述】:
我必须编写一个应用程序,在一个 Widget 中显示加载的视频,拉取帧,转换它们,然后将它们放入另一个 Widget,最好是 QGraphicsView,并希望同步。同步它们对它们来说非常重要。
我写了一个测试线程,主要的肉是这样的:
void HSV::display() {
Ui::MainWindow ui; //1
int j=0;
QTimer *timer = new QTimer;
for(int i=1; i<4; i++){
QString numer = QString::number(i);
QImage imageTest(numer+".jpg");
QGraphicsPixmapItem* test = new QGraphicsPixmapItem(QPixmap::fromImage(imageTest));
QGraphicsScene* sceneHSV = new QGraphicsScene;
sceneHSV->addItem(test);
//2
ui.graphicsViewKalibracjaHSV->setScene(sceneHSV);
ui.graphicsViewKalibracjaHSV->fitInView(sceneHSV->sceneRect(),Qt::KeepAspectRatio);
ui.graphicsViewKalibracjaHSV->show();
timer->start(500);
if(i==3) {
i=1;
}
j++;
if (j>40) {
break;
}
}
}
这不是我需要的,但这只是一个测试。如果我把文字放在那里,它会很好地通过,继续显示。但是这些图像......当到达第一行 ui 时立即崩溃( //2 )。我毫不怀疑这种做事方式非常糟糕。
如果我在 //1 删除 Ui::MainWindow ui;,它会告诉我 ui is not declared in this scope 。
所以我的问题是,如何从单独的线程访问和修改主窗口中的 ui 元素?
编辑: 好吧,一个更实际的想法。我将简单地将视频文件 URL 从 GUI 线程传递到工作线程,在那里执行所有操作并将 2 个处理后的图像传回(对于每个视频帧),每个 QGraphicsView 一个。一个正常的,带有标记的点,一个转换的。我现在知道如何将东西从工作线程传递到 GUI 线程,但是如何将 QString 从 GUI 传递到工作线程,以及如何接收它?
【问题讨论】:
-
我没有看到 ui->setupUi(this);
标签: c++ multithreading qt user-interface