关于QT的绘图
最近研究了關于QT的繪圖的相關的知識,下面來總結下:
QT設置控件的顏色有以下幾種方式:
1. QPalette (調色板)
QPalette類包含每個小部件狀態的顏色組。調色板由三個顏色組組成:活動的、禁用的和非活動的。Qt中的所有小部件都包含一個調色板,并使用它們的調色板繪制自己。這使得用戶界面易于配置和保持一致。如果您創建了一個新的小部件,我們強烈建議您使用調色板中的顏色,而不是硬編碼特定的顏色。顏色組:活動組用于具有鍵盤焦點的窗口。非活動組用于其他窗口。禁用組用于由于某種原因禁用的小部件(不是窗口)。活動窗口和非活動窗口都可以包含禁用的小部件。(禁用的小部件通常被稱為不可訪問的或灰色的。)在大多數樣式中,Active和Inactive看起來是相同的。可以使用setColor()和setBrush()為調色板的任何顏色組中的特定角色設置顏色和畫筆。顏色組包含小部件用于繪圖的一組顏色。我們建議小部件使用調色板中的顏色組角色,比如“前景”和“基礎”,而不是像“紅色”或“綠松石色”這樣的文字顏色。顏色角色在ColorRole文檔中枚舉并定義。我們強烈建議您使用當前樣式的默認選項板(由QApplication::palette()返回)并根據需要修改它。這是由Qt的小部件繪制完成的。要修改一個顏色組,您可以調用setColor()和setBrush()函數,這取決于您想要純色還是位圖模式。還有相應的color()和brush() getter,以及一個常用的方便函數來獲取當前ColorGroup的ColorRole: window()、windowText()、base()等。您可以使用copy構造函數復制調色板,并使用isCopyOf()測試兩個調色板是否相同。QPalette是通過使用隱式共享進行優化的,因此將QPalette對象作為參數傳遞是非常有效的。警告:有些樣式不會為所有繪圖使用調色板,例如,如果它們使用本機主題引擎的話。Windows XP、Windows Vista和Mac OS X風格都是如此。
QPalette pale = label->palette();
pale.setColor(ColorRole, QColor); //ColorRole 代表是控件哪個位置上的顏色,例如控件的字體顏色,控件的背景顏色,控件的前景色等等。
label->setPalette(pale);
2.通過setstylesheet設置美化控件。
stylesheet是QT專門的為QT界面美化所設計的一個功能,采用QSS語言,這里不詳細介紹,有需要的可自行前往了解。
3.通過paintEvent函數進行重繪。
說到重繪就必須得介紹QT的幾個類 QPainter, QPaintdevice, QPaintEngine
QPainter類在小部件和其他繪畫設備上執行低級別的繪畫。QPainter提供了高度優化的函數來完成大部分圖形界面程序所需要的工作。它可以畫任何東西,從簡單的線條到復雜的形狀,比如餡餅和和弦。它還可以繪制對齊的文本和像素圖。通常情況下,它會繪制一個“自然的”坐標系統,但它也可以進行視圖和世界轉換。QPainter可以操作繼承了QPaintDevice類的任何對象。QPainter的常用用法是在一個小部件的繪制事件中:構造和定制(例如設置筆刷或筆刷)繪制器。然后畫。記得在畫完畫后銷毀QPainter對象。例如:
Widget::paintEvent(QPaintEvent *)
{
QPainter paint(this);
painter.setPen(Qt:blue);
painter.setFont(QFont(“Ubuntu”,30));
painter.drawText(rect(), Qt::AlignCenter,Qt);}
}
QPainter的核心功能是繪圖,但是這個類還提供了一些功能,允許您自定義QPainter的設置及其呈現質量,以及其他支持裁剪的功能。此外,您還可以通過指定畫家的構圖模式來控制不同形狀是如何合并在一起的。isActive()函數指示畫家是否處于活動狀態。painter被begin()函數和接受QPaintDevice參數的構造函數激活。函數end()和析構函數使其失效。QPaintDevice和QPaintEngine classes一起構成了Qt涂料體系的基礎。QPainter是用來執行繪圖操作的類。QPaintDevice表示可以使用QPainter來繪制的設備。QPaintEngine提供了畫家用來繪制不同類型設備的界面。如果油漆工處于活動狀態,device()返回油漆工繪制的油漆設備,paintEngine()返回油漆工當前操作的油漆引擎。有關更多信息,請參閱涂料系統。有時讓別人在一個不尋常的QPaintDevice上作畫是可取的。QPainter支持一個靜態函數來完成這項工作,setredirect()。
警告:當繪制設備是小部件時,QPainter只能在paintEvent()函數或paintEvent()調用的函數中使用;除非設置了Qt::WA_PaintOutsidePaintEvent小部件屬性。在Mac OS X和Windows上,您只能在paintEvent()函數中繪制,而不考慮該屬性的設置。
?
QPaintDevice類是可以繪制的對象的基類。
繪畫設備是一個可以用QPainter繪制的二維空間的抽象。它的默認坐標系的原點位于左上角。X向右增加Y向下增加。單位是一個像素。QPaintDevice的繪圖功能目前由QWidget、QImage、QPixmap、QGLPixelBuffer、QPicture和QPrinter子類實現。要實現對新后端的支持,您必須從QPaintDevice派生并重新實現虛擬paintEngine()函數,以告訴QPainter應該使用哪個油漆引擎來繪制這個特定的設備。注意,您還必須創建一個相應的油漆引擎才能在設備i上繪制。e從QPaintEngine派生而來,重新實現其虛函數。警告:Qt要求QApplication對象在創建任何繪畫設備之前存在。油漆設備訪問窗口系統資源,這些資源在創建應用程序對象之前沒有初始化。QPaintDevice類提供了幾個函數來返回各種設備指標:depth()函數返回它的位深度(位平面數)。height()函數返回默認坐標系統單元的高度(例如QPixmap和QWidget的像素),而heightMM()函數返回以毫米為單位的設備高度。同樣,width()和widthMM()函數分別以默認坐標系單元和毫米為單位返回設備的寬度。另外,還可以使用protected指標()函數通過指定所需的PaintDeviceMetric作為參數來檢索指標信息。logicalDpiX()和logicalDpiY()函數返回設備的水平和垂直分辨率(單位為每英寸點數)。physicalDpiX()和physicalDpiY()函數還返回設備每英寸的點分辨率,但請注意,如果邏輯分辨率和物理分辨率不同,對應的QPaintEngine必須處理映射。最后,colorCount()函數返回油漆設備可用的不同顏色的數量。
PaintDevice著重介紹QPixmap, QImage。
QPixmap專門針對如何把圖形畫到界面上去做了優化,它的實現與畫圖的硬件設備直接相關,因此他只能在GUI主線程中使用。
QImage類提供了一種硬件無關的圖像表示,允許直接訪問像素數據,并且可以用作繪圖設備。Qt提供了四個處理圖像數據的類:QImage、QPixmap、QBitmap和QPicture。QImage用于I/O和直接像素訪問和操作,QPixmap用于在屏幕上顯示圖像。QBitmap只是繼承了QPixmap的一個方便類,它保證了深度為1。最后,QPicture類是一個記錄和回放QPainter命令的繪圖設備。因為QImage是一個QPaintDevice子類,所以QPainter可以直接繪制到圖像上。在QImage上使用QPainter時,可以在另一個線程中進行繪制,而不是在當前GUI線程中。QImage類支持Format enum描述的幾種圖像格式。這些包括單色、8位、32位和alpha混合的圖像,在Qt 4.x的所有版本中都可以使用。QImage提供了一組函數,可用于獲取關于圖像的各種信息。還有幾個功能可以實現圖像的轉換。QImage對象可以通過值傳遞,因為QImage類使用隱式數據共享。QImage對象也可以進行流和比較。
因此我們處理較復雜的圖像時可以先通過Qimage把圖像大小,圖案等先處理好,再直接轉換到QPixmap上,進行繪制可提高繪制效率。
其中據我測試過:三種設置顏色的優先級: paintEvent > stylesheet > QPalette 。優先級的原因正在學習中,有搞清楚的同學可以相互交流。
注:原創文章,轉載請標明出處,謝謝!
?
?
?
?
?
總結
- 上一篇: linux 中 svn 服务器搭建 重
- 下一篇: python实战之编码问题:中文!永远的