Qt畫圖

Qt畫圖有幾個概念先要理清楚:QImage、QPixmap、QBitmap和QPicture。都是處理圖像的類,有着各自的特點。
QImage優化了I/O操作,可以直接存取操作像素數據;
QPixmap主要用來在屏幕上顯示圖像;
QBitmap從QPixmap繼承,只能表示兩種顏色;
QPicture是可以記錄和重放QPainter命令的類。

QImage提供了與硬件無關的圖像表示方法,通過QImage可以直接存取像素數據,QImage也可以用作繪製設備。因爲QImage從QPaintDevice繼承,所以QPainter可以直接在QImage上繪圖。QImage有點類似於opencv中的mat,故它們之間可以互相轉換。

cv::Mat rgb;
    QImage img;
    if(image.channels() == 3)    // RGB image
    {
        cvtColor(image,rgb,CV_BGR2RGB);
        img = QImage((const uchar*)(rgb.data),  //(const unsigned char*)
                     rgb.cols,rgb.rows,
                     rgb.cols*rgb.channels(),   //解決Mat圖像與QImage圖像不對齊問題
                     QImage::Format_RGB888);
    }
    else
    {                     // gray imag
        img = QImage((const uchar*)(image.data),
                         image.cols,image.rows,
                         image.cols*image.channels(),    //解決Mat圖像與QImage圖像不對齊問題
                         QImage::Format_Indexed8);

    }

QPixmap主要完成屏幕後臺緩衝區繪圖。QPixmap中的像素數據是內部的,並且有底層的窗口系統進行管理。如果要存取像素,只有通過QPainter函數或將QPixmap對象轉換爲QImage對象。QImage和QPixmap可以相互轉換。通常QImage載入圖像並進行直接操作,然後轉換爲QPixmap在屏幕上顯示。如果不需要操作像素,就直接使用QPixmap。在windows中QPixmap與HBitmap相似,所有它們可以相互轉換。
QPixmap::fromImage(img)

Qt畫圖這類事情要放在PaintEvent函數裏去做。這個機制至於爲什麼還沒研究過。
Reference:
1.自學QT之QWidget::paintEngine: Should no longer be called的解決辦法
2.QPainter::begin: Paint device returned engine == 0, type: 2 解決方法
3.Qt: QWidget::paintEngine: Should no longer be called

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