QT中QLabel控件上显示图片及paintEvent的使用
底层图片用drawPixmap()上层QLabel自带控件属性,直接ui设计器中修改的
·
底层图片用drawPixmap()
上层QLabel自带控件属性,直接ui设计器中修改的

QPixmap是绘图设备,采用双缓冲机制绘图。—摘自《Qt开发及实例》P384页,对应的pdf中页码P397
QImage是 对于图像像素处理
尽量使用setPixmap绘图,
使用drawPixmap时,本意想在图片上显示矩形框,但发现不成功,被遮盖了。
使用drawPixmap的例子:
代码如下:
void NewTestForm::paintEvent(QPaintEvent *event)
{
//QPainter dc(&m_image);
QPainter dc(this);
// if(m_bisPress)
{
QPen pen(Qt::red);
dc.setPen(pen);
int nWidth = abs(m_nNewPt.x() - m_nOldPt.x());
int nHeight = abs(m_nNewPt.y() - m_nOldPt.y());
//dc.drawRect(ui->label_2->pos().x() + m_nOldPt.x(), ui->label_2->pos().y() + m_nOldPt.y(), nWidth, nHeight);
dc.drawRect( 30, 350, 100, 100);
}
for(int i = m_image.width() / 2 - 3; i <= m_image.width() / 2; i++)
{
m_image.setPixel(i, m_image.height() / 2, 0);
}
QPixmap pix = QPixmap::fromImage(m_image);
//ui->label_2->setPixmap(pix);
dc.drawPixmap(ui->label_2->geometry().x(),ui->label_2->geometry().y(),ui->label_2->width(), ui->label_2->height(), pix);
//dc.drawLine(10,10,100,100);//点(10,10)和(100,100)是在图像上这个画图设备的
}
界面显示:红色地方被遮盖了
使用setPixmap
void NewTestForm::paintEvent(QPaintEvent *event)
{
QPainter dc(&m_image);
i = m_image.width() / 2 - 3; i <= m_image.width() / 2; i++)
{
m_image.setPixel(i, m_image.height() / 2, 0);
}
dc.setPen(Qt::red);
// dc.drawLine(m_nOldPt.x(), m_nOldPt.y() , m_nOldPt.x() + 15, m_nOldPt.y() + 15);
dc.drawLine(100, 100 ,25,25);
QPixmap pix = QPixmap::fromImage(m_image);
ui->label_2->setPixmap(pix);
dc.drawLine(100*1.6,100*1.6,100*1.6,200*1.6);//点(10,10)和(100,100)是在图像上这个画图设备的
}
paintEvent
在上面两个函数都是在## paintEvent中实现的,
- 第一个函数中 QPainter dc(this)
画布为整个窗体,所以,在画布上画点时,基准点为 窗口的左上角。
- 第二个函数 QPainter dc(&m_image);
画布为m_image 图像,要注意图像在ui->label_2->setPixmap(pix);之前的m_image是否缩放了。
本例中,在此处之前的m_image没有被缩放,所以,在画布上画点时,
dc.drawLine(100*1.6,100*1.6,100*1.6,200*1.6);//点(10,10)和(100,100)是在图像上这个画图设备的
图像上的点要放大到画布上,就有了前面的X * 1.6
同理,如果控件中图像被放大了,画点时也要缩小到画布上。
最终是在画布上进行画的,一定要统一到画布上去。
参考文献
QT Q Image QPixmap ·QBitmap 三者区别
https://blog.51cto.com/11496263/1867507
更多推荐




所有评论(0)