• 4925阅读
  • 1回复

怎么从另一个线程向 GUI 线程传图像? [复制链接]

上一主题 下一主题
离线songzw
 
只看楼主 倒序阅读 楼主  发表于: 2010-05-16
想用 QT 做一个界面加到已有的多线程程序中显示图像,首先用 Qt Creator 做了一个界面,加了个  QGraphicsView graphicsView 在上面

在已有的多线程程序中生成一个线程做为 GUI 线程:
QApplication a(argc, argv);
Window = new MainWindow; // Window 是全局变量
Window->show()
a->exec();

另外一个已有的线程:
QImage image = .... // 生成图像
这时候怎么告诉 GUI 线程来读这个图像呢?我试了几个 signal/slot 的方法都不行,可能我新手对 signal/slot 理解的不对,我把这些方法列在下面,大侠能帮我看看吗?多谢了!

方法一:
在 MainWindow 中加
private:
    QImage image;
    QPixmap pixmap;
    QGraphicsScene graphicsScene;
public slots:
    void SetImage(QImage AImage) { emit OnImageChanged(AImage); }
signals:
   void OnImageChanged(QImage AImage);
private slots:
   void ShowImage(QImage AImage) {
      image = AImage;
      pixmap.fromImage(image);
      pixmap = pixmap.scaledToHeidht(480);
      graphicsScene.addPixmap(pixmap);
      ui->graphicsView->setScene(graphicsScene);
  }
public:
    void Init() { connect(this, SIGNAL(OnImageChanged(QImage)), this, SLOT(ShowImage(QImage)));

在 GUI 线程中调用 Window->Init();
在另一个线程中调用 Window->SetImage(image);

方法二:
在 MainWindow 中加入
public:
    QImage image;
private:
    QPixmap pixmap;
    QGraphicsScene graphicsScene;
public slots:
   void ShowImage(QObject* = NULL) {
      pixmap.fromImage(image);
      pixmap = pixmap.scaledToHeidht(480);
      graphicsScene.addPixmap(pixmap);
      ui->graphicsView->setScene(graphicsScene);
  }

在另一个线程中
Window->image = image;
QObject* temp = new QObject();
QObject::connect(temp, SIGNAL(destroyed(QObject*)), Window, SLOT(ShowImage(QObject*)));
delete temp;


以上两个方法都不行。

一个线程生成图像,然后给 GUI 线程一个消息进行刷新,到底该怎么实现这个功能呢?signal/slot? event?

大侠们来救我啊
离线paranoid
只看该作者 1楼 发表于: 2010-05-16
QT里有个例子threads mandelbrot,跟你的需求是一样的
快速回复
限100 字节
 
上一个 下一个