问题具体如下:(平台linux fedora 版本qt4.8.4)
开始用qml写了界面,其中一块是监控部分,qt c++下完成摄像头的视频的采集,我想将采集的图片在qml界面上显示。采取的方法是将采集到的每幅图片都保存成一个png格式的图片(video1.png)。然后在qml下用个定时器反复读取该图片路径加载。但是界面只显示第一次存储的图片,定时器是起作用的,可能是由于路径不变,图片只读取了一次。看文件夹下的图片是在不断更新的。我想问下将摄像头的视频在qml下显示出来的方法,我想过要么用个循环队列存取多幅图片用qml读取,还没试而且觉得不妥。摄像头部分c++代码是网上下载的能正常运行,是绘制在label中的,我稍微改了下程序不绘制,只存储成文件供qml读取。另外我也不知道如何qml中调用qt中的部件,比如label这种。
混编的方法是将c++类定义一个新的QML元素,头文件就不贴了。
c++部分代码:
ProcessImage::ProcessImage(QWidget *parent):QWidget(parent)
{
....
timer = new QTimer(this);
//connect(timer,SIGNAL(timeout()),this,SLOT(update()));//update()调用paintEvent函数
connect(timer,SIGNAL(timeout()),this,SLOT(ReadFrameData()));
timer->start(30);
....
}
void ProcessImage::ReadFrameData()
{
rs = vd->get_frame((void **)&p,&len);//获取视频数据
convert_yuv_to_rgb_buffer(p,pp,640,480/*QWidget::width(),QWidget::height()*/);//转换格式yuv-rgb
frame->loadFromData((uchar *)pp,/*len*/640 * 480 * 3 * sizeof(char));//得到image
pixframe=QPixmap::fromImage(*frame,Qt::AutoColor);//将图像转换成pixmap
pixframe.save("qml/terminal/core/video1.png");//存储图像
...
}
qml部分代码:
Item {
property string videoPath1:"video1.png"
width: 780;height: 380
visible: false
Videodata{
id:videodata
}//
Timer{
interval:100; running: true; repeat: true
onTriggered: {
test.source=videoPath1(这里)
console.log("video");
}
}
Rectangle{
z:0
anchors.fill: parent
radius:8
color:"lightgreen"
border{width:2;color:"black"}
Rectangle{
z:1
width:500;height:340
color:"yellow"
border{width:2;color:"black"}
anchors{top:parent.top;topMargin:20;left:parent.left;leftMargin:20}
Image{
z:2
anchors.fill:parent
id:test
}
}
}
}
初学很多不懂,写的有点乱,见谅。