解決在控件上繪圖,以及繪圖後的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("");
    }
}


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