解决在控件上绘图,以及绘图后的CPU的高负荷的问题

由于需要在一个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("");
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章