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