在Qt 5.1.1中使用线程在QLabel中不显示视频

时间:2014-05-27 08:43:34

标签: c++ multithreading qt opencv video

其实我想用多线程编程来创建我的应用程序。 我的程序运行成功,但视频不在QLabel中显示。 如果我没有使用多线程编程,那么当我应用多线程编程时,视频完全显示在QLabel中并且程序运行成功,那么问题确实发生了。 那么如何解决这个问题呢? 我尝试了很多并尝试谷歌搜索,但仍然没有得到任何解决方案。 所以我请求请尽力帮我解决这个问题。 提前谢谢。

这是我的test2.h文件

#ifndef TEST2_H
#define TEST2_H

#include <QMainWindow>
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <QtCore>

namespace Ui {
class test2;
class test22;
}

class test2 : public QMainWindow , public QThread
{
    //Q_OBJECT

public:
    explicit test2(QWidget *parent = 0);
    ~test2();
    void closeEvent(QCloseEvent *);

private slots:
    void on_pushButton_clicked();

public:
    Ui::test2 *ui;

    IplImage *iplImg;
    QImage qimgNew;

public:
    void run();
};


class test22 : public QMainWindow , public QThread
{
    //Q_OBJECT

public:
    Ui::test22 *ui;
    IplImage *iplImg;
    QImage qimgNew;

public:
    void run();
};
#endif // TEST2_H

这是我的main.cpp文件

#include "test2.h"
#include <QApplication>
#include <qcoreapplication.h>
#include <qthread.h>
#include <QThread>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    test2 w;
    w.show();
    test2 mthread1;
    test22 mthread2;

    mthread1.start();
    mthread2.start();

    return a.exec();
}

这是我的test2.cpp文件

#include "test2.h"
#include "ui_test2.h"
#include <opencv2/opencv.hpp>
#include <iostream>
#include <qthread.h>
#include <QThread>
using namespace std;

CvCapture *input1;
CvCapture *input2;
IplImage *frame1;
int i = 0;


test2::test2(QWidget *parent) :
QMainWindow(parent),QThread(parent),
    ui(new Ui::test2)
{
    ui->setupUi(this);
}

test2::~test2()
{
    delete ui;
}


void test2::run()
{
    input1 = cvCaptureFromAVI("E://1.avi");
    IplImage* frame1;
    frame1 = cvQueryFrame(input1);
    qimgNew = QImage((const unsigned char*)frame1->imageData,frame1->width,frame1->height,QImage::Format_RGB888).rgbSwapped();
    ui->lbl1->setPixmap(QPixmap::fromImage(qimgNew));
    ui->lbl1->repaint();
    qApp->processEvents();
    for(;;)
    {
    //show();
        frame1 = cvQueryFrame(input1);
        qimgNew = QImage((const unsigned char*)frame1->imageData,frame1->width,frame1->height,QImage::Format_RGB888).rgbSwapped();
        ui->lbl1->setPixmap(QPixmap::fromImage(qimgNew));
        ui->lbl1->repaint();
        qApp->processEvents();
        cvSaveImage("E://t1.jpg",frame1);
        cvWaitKey(10);
    }
}


void test22::run()
{
    input2 = cvCaptureFromAVI("E://combined_video.mp4");
    IplImage* frame2;
    frame2 = cvQueryFrame(input2);
    cvShowImage("frame2",frame2);
    qApp->processEvents();

    for(;;)
    {
        frame2 = cvQueryFrame(input2);
        cvShowImage("frame2",frame2);
        qApp->processEvents();
    }
}

void test2::on_pushButton_clicked()
{
}

void test2::closeEvent(QCloseEvent *)
{
    exit(1);
}

这次pushButton处于禁用模式,所以请忘记这个程序中的pushButton。

为了更加理解,我在该图像中附加了一个图像。一个QMainwindow在那里,两个QLabel在那里,因此左侧QLabel用于显示一个视频,第二个QLabel现在处于空闲状态。但第二个视频将显示在另一个窗口,这是一个简单的控制台窗口。 意味着我使用了两个线程的第一个线程是QLabel中的第一个视频,第二个线程是在consol窗口中的第二个视频。问题是第二个视频在控制台窗口中成功显示但是第一个视频没有显示在Left Qlabel中。即使程序运行成功。

我在Visual Studio 2010中使用Qt插件。

图片在这里:https://drive.google.com/file/d/0Bx-SbWMsrD92a2dwZkQtVnA1dUU/edit?usp=sharing

0 个答案:

没有答案