我是靠谱客的博主 落后人生,最近开发中收集的这篇文章主要介绍请教如何在QT自定义线程类中使用QTimer定时器功能,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

代码贴上

VideoPlayThread.h:

class VideoPlayThread : public QThread{
 
private:
    QLabel * label_videoPlayer;
    QString fileName;
    CvCapture * g_capture;
 
    QImage * img;
    IplImage* frame;
public:
    VideoPlayThread();
    void run();
    void setFileName(QString FN);
    void setLabelVideoPlayer(QLabel * labelVP);
private slots:
    void nextFrame();
 
};
 
 
 
VideoPlayThread.cpp
VideoPlayThread::VideoPlayThread() : QThread()
{
//    timer = new QTimer;
//    connect(timer, SIGNAL(timeout()), this, SLOT(VideoPlayThread::nextFrame()));
}
void VideoPlayThread::setFileName(QString FN)
{
    fileName = FN;
}
void VideoPlayThread::setLabelVideoPlayer(QLabel * labelVP)
{
    label_videoPlayer = labelVP;
}
void VideoPlayThread::nextFrame()
{
    frame = cvQueryFrame(g_capture);
    if(frame)
    {
        cvCvtColor(frame, frame, CV_BGR2RGB);
        img = new QImage((uchar*)frame->imageData, (int)frame->width, (int)frame->height, (int)frame->widthStep, QImage::Format_RGB888);
        *img = img->scaledToWidth(label_videoPlayer->width(), Qt::FastTransformation);
        label_videoPlayer->setPixmap(QPixmap::fromImage(*img));
    }
//    else
//        timer->stop();
}
void VideoPlayThread::run()
{
    g_capture = NULL;
    QByteArray temp = fileName.toLatin1();
    char * FileName = temp.data();
    g_capture = cvCreateFileCapture(FileName);
    int frameNum = (int)cvGetCaptureProperty(g_capture, CV_CAP_PROP_FRAME_COUNT);
    double fps = cvGetCaptureProperty(g_capture, CV_CAP_PROP_FPS);//获取帧率
    double vfps = 1000/fps;//计算每帧的播放时间
    frame = cvQueryFrame(g_capture);
    if(frame)
    {
        cvCvtColor(frame, frame, CV_BGR2RGB);
        img = new QImage((uchar*)frame->imageData, (int)frame->width, (int)frame->height, (int)frame->widthStep, QImage::Format_RGB888);
        *img = img->scaledToWidth(label_videoPlayer->width(), Qt::FastTransformation);
        label_videoPlayer->setPixmap(QPixmap::fromImage(*img));
        QTimer *timer = new QTimer;
        connect(timer, SIGNAL(timeout()), this, SLOT(nextFrame()));
        timer->start(30);
    }
    exec();
    cvReleaseCapture(&g_capture);
}
调试的时候,发现问题好像是connect(timer, SIGNAL(timeout()), this, SLOT(nextFrame()));这一句,提示信息是:No such slot QThread::nextFrame()。

这个我槽函数定义在自定义的线程类VideoPlayThread里了,而且this也显示的是VideoPlayThread*类型,为什么connect函数要去QThread里找槽函数?

还有这一块应该怎么写啊。

小弟叩首求教。


最后

以上就是落后人生为你收集整理的请教如何在QT自定义线程类中使用QTimer定时器功能的全部内容,希望文章能够帮你解决请教如何在QT自定义线程类中使用QTimer定时器功能所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(84)

评论列表共有 0 条评论

立即
投稿
返回
顶部