由于需要在一个Widget上先做一个透明,使得下面的摄像头数据可以透上来,然后再在上面需要画线,由于使用了使用
painter.setCompositionMode(QPainter::CompositionMode_Clear);
painter.fillRect(2, 2, 237, 268, Qt::SolidPattern);
类似这种的命令,因此不能再在上面画图,所以想到的解决办法是在上面覆盖一个label,在label上画图解决这个问题
功能是可以透明,并且按键切换监控的方式(双屏看X和Y两个摄像头或者单屏看X或者Y摄像头),并且在图像上显示一些直线(可以扩展成为文字或者别的标示)
于是一开始的代码是这样
void Widget::paintEvent(QPaintEvent*)
{
QPainter painter;
QImage image(480,272,QImage::Format_ARGB32);
painter.begin(&image);
//drawline
painter.setPen(Qt::green); // pencil to green color
painter.drawLine(121, 25, 121, 268);
painter.drawLine(241, 25, 241, 268);
painter.drawLine(361, 25, 361, 268);
painter.end();
ui->lbl_painter->setPixmap(QPixmap::fromImage(image));// show image on label
QPainter painter2(this);
//set transparency
painter2.setCompositionMode(QPainter::CompositionMode_Clear);
//set font
QFont font;
font.setPointSize(18); //font size
font.setBold(TRUE);
ui->lbl_x->setFont(font);
ui->lbl_y->setFont(font);
if (g_XY_Status == SP_XY_MODE_XY)
{
painter2.fillRect(2, 2, 237, 268, Qt::SolidPattern);
painter2.fillRect(241, 2, 237, 268, Qt::SolidPattern);
ui->lbl_x->setText("X");
ui->lbl_y->setText("Y");
}
else if (g_XY_Status == SP_XY_MODE_X)
{
painter2.fillRect(2, 2, 476, 268, Qt::SolidPattern);
ui->lbl_x->setText("X");
ui->lbl_y->setText("");
}
else if (g_XY_Status == SP_XY_MODE_Y)
{
painter2.fillRect(2, 2, 476, 268, Qt::SolidPattern);
ui->lbl_x->setText("Y");
ui->lbl_y->setText("");
}
update();
}
但是由于这样会使得CPU占用一直过高,在嵌入式设备中导致比如timer不准,以及拖累整个系统的问题,因此改成需要不能实时刷新,必须按键刷新的方式
主要是采用了过滤器,监控按键修改的状态,代码如下:
void Widget::status_xy_change()
{
if (g_XY_Status == SP_XY_MODE_XY)
{
g_XY_Status = SP_XY_MODE_X;
this->update();
}
else if (g_XY_Status == SP_XY_MODE_X)
{
g_XY_Status = SP_XY_MODE_Y;
this->update();
}
else if (g_XY_Status == SP_XY_MODE_Y)
{g_XY_Status = SP_XY_MODE_XY;
this->update();
}
eapi_write_int(0, 0, MIB_SP_CONFIG_XY, g_XY_Status);
//this->update();
}
bool Widget::eventFilter(QObject *watched, QEvent *event)
{
if(watched == ui->lbl_painter && event->type() == QEvent::Paint)
{
drawLines();
}
if(watched == this && event->type() == QEvent::Paint)
{
showCamera();
}
return QWidget::eventFilter(watched,event);
}
void Widget::drawLines()
{
QPainter painter(ui->lbl_painter);
painter.setPen(Qt::green);
painter.drawLine(121, 25, 121, 268);
painter.drawLine(241, 25, 241, 268);
painter.drawLine(361, 25, 361, 268);
}
void Widget::showCamera()
{
QPainter painter(this);
//set transparency
painter.setCompositionMode(QPainter::CompositionMode_Clear);
//set font
QFont font;
font.setPointSize(18); //font size
font.setBold(TRUE);
ui->lbl_x->setFont(font);
ui->lbl_y->setFont(font);
if (g_XY_Status == SP_XY_MODE_XY)
{
painter.fillRect(2, 2, 237, 268, Qt::SolidPattern);
painter.fillRect(241, 2, 237, 268, Qt::SolidPattern);
ui->lbl_x->setText("X");
ui->lbl_y->setText("Y");
}
else if (g_XY_Status == SP_XY_MODE_X)
{
painter.fillRect(2, 2, 476, 268, Qt::SolidPattern);
ui->lbl_x->setText("X");
ui->lbl_y->setText("");
}
else if (g_XY_Status == SP_XY_MODE_Y)
{
painter.fillRect(2, 2, 476, 268, Qt::SolidPattern);;
ui->lbl_x->setText("Y");
ui->lbl_y->setText("");
}
}