在Qt中經常要本身重載一些paintEvent函數,這個時候每每忽略了兩個很關鍵的API,那就是setViewport和setWindow。函數
Viewport,顧名思義,反應的是物理座標,就是你實際想在當前座標系下哪塊區域畫圖,好比(50,50,100,100)的一個rect.get
Window而是邏輯座標,你能夠設置它從(0,0)開始,這樣你能夠setViewport(m_rect)以後,setWindow(0, 0, m_rect.width(), m_rect.height())來從新把物理座標的rect映射到本身以(0,0)座標系下的rect來進行繪圖,十分方便。這樣你能夠在保持邏輯座標 window不變的狀況下,動態的改變viewport物理座標,作到放大,平移等操做。好比把viewport放大成兩倍,但此時你的window畫圖 座標就不須要改變。作到了邏輯和物理的二者分離。map
一樣的,你也能夠用viewport和window來實現Qt中QGraphics那一套的座標映射關係,好比mapFromParent等,mapToParent.viewport
已知當前m_rect,做爲本身的父rect.此時傳進來的pos只須要減去m_rect.topLeft()就是mapFrom,加上 m_rect.topLeft()就是mapTo,一樣對於rect來講rect.topLeft - m_rect.topLeft, rect.widget(), rect.height()就完成了mapFromParent的Rect映射。top