翻譯|使用教程|編輯:鮑佳佳|2021-03-29 10:57:08.457|閱讀 210 次
概述:模擬時鐘窗口示例顯示了如何繪制自定義窗口的內(nèi)容。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
Qt是一個跨平臺框架,通常用作圖形工具包,它不僅創(chuàng)建CLI應用程序中非常有用。而且它也可以在三種主要的臺式機操作系統(tǒng)以及移動操作系統(tǒng)(如Symbian,Nokia Belle,Meego Harmattan,MeeGo或BB10)以及嵌入式設備,Android(Necessitas)和iOS的端口上運行。現(xiàn)在我們?yōu)槟闾峁┝嗣赓M的試用版。
Qt組件推薦:
模擬時鐘窗口示例
模擬時鐘窗口示例顯示了如何繪制自定義窗口的內(nèi)容。
時鐘窗口示例
此示例演示了如何使用QPainter的變換和縮放功能使繪圖更容易。
AnalogClockWindow類定義
AnalogClockWindow類提供了一個帶有時針和分針的時鐘,每隔幾秒鐘就會自動更新一次。我們利用光柵窗口示例中的RasterWindow,重新實現(xiàn)渲染函數(shù)來繪制鐘面。
class AnalogClockWindow : public RasterWindow { public: AnalogClockWindow(); protected: void timerEvent(QTimerEvent *) override; void render(QPainter *p) override; private: int m_timerId; };
AnalogClock類的實現(xiàn)
AnalogClockWindow::AnalogClockWindow() { setTitle("Analog Clock"); resize(200, 200); m_timerId = startTimer(1000); }
我們在窗口上設置標題,并將其大小調(diào)整為合理的大小。然后,我們啟動一個計時器,該計時器將用于每秒重繪時鐘。
void AnalogClockWindow::timerEvent(QTimerEvent *event) { if (event->timerId() == m_timerId) renderLater(); }
由于調(diào)用startTimer,因此每秒都會調(diào)用timerEvent函數(shù)。利用基類中的便利,我們計劃要重新繪制的窗口。
由于在這種情況下我們只有一個活動計時器,因此嚴格不要求檢查計時器的ID,但這樣做是一種很好的做法。
void AnalogClockWindow::render(QPainter *p) { static const QPoint hourHand[3] = { QPoint(7, 8), QPoint(-7, 8), QPoint(0, -40) }; static const QPoint minuteHand[3] = { QPoint(7, 8), QPoint(-7, 8), QPoint(0, -70) }; QColor hourColor(127, 0, 127); QColor minuteColor(0, 127, 127, 191);
在我們設置畫家并繪制時鐘之前,我們首先定義兩個QPoints列表和兩個QColors,它們將用于時針和分針。分針的顏色有一個191的阿爾法分量,意味著它有75%的不透明性。
p->setRenderHint(QPainter::Antialiasing);
我們使用QPainter :: Antialiasing調(diào)用QPainter :: setRenderHint()以打開抗鋸齒。這使得對角線的繪制更加平滑。
p->translate(width() / 2, height() / 2); int side = qMin(width(), height()); p->scale(side / 200.0, side / 200.0);
平移將原點移動到窗口的中心,而縮放操作則確保下面的繪圖操作被縮放到適合窗口內(nèi)。我們使用一個縮放因子,讓我們使用-100和100之間的x和y坐標,并確保這些坐標位于窗口最短邊的長度內(nèi)。
為了使我們的代碼更簡單,我們將繪制一個固定大小的鐘面,將其定位和縮放,使其位于窗口的中心。
我們還確定了窗口最短邊的長度,這樣我們就可以把鐘面放在窗口內(nèi)。
畫家負責處理渲染過程中的所有轉(zhuǎn)換,并確保一切都能正確繪制。讓畫家處理變換通常比進行手工計算更容易。
我們首先使用公式繪制時針,該公式將坐標系逆時針旋轉(zhuǎn)由當前小時和分鐘確定的度數(shù)。這意味著將顯示指針順時針旋轉(zhuǎn)所需的量。
p->setPen(Qt::NoPen); p->setBrush(hourColor);
我們將筆設置為Qt :: NoPen是因為我們不需要任何輪廓,并且我們使用具有適合顯示小時數(shù)的顏色的實心筆刷。填充多邊形和其他幾何形狀時使用畫筆。
QTime time = QTime::currentTime(); p->save(); p->rotate(30.0 * ((time.hour() + time.minute() / 60.0))); p->drawConvexPolygon(hourHand, 3); p->restore();
我們要保存和恢復旋轉(zhuǎn)前后的變換矩陣,因為我們希望放置分針而不必考慮任何先前的旋轉(zhuǎn)。
p->setPen(hourColor); for (int i = 0; i < 12; ++i) { p->drawLine(88, 0, 96, 0); p->rotate(30.0); }
我們每小時在時鐘的邊緣繪制一個標記。我們繪制每個標記,然后旋轉(zhuǎn)坐標系,以便畫家準備下一個標記。
p->setPen(Qt::NoPen); p->setBrush(minuteColor); p->save(); p->rotate(6.0 * (time.minute() + time.second() / 60.0)); p->drawConvexPolygon(minuteHand, 3); p->restore();
分針的旋轉(zhuǎn)方式與時針的旋轉(zhuǎn)方式相似。
p->setPen(minuteColor); for (int j = 0; j < 60; ++j) { if ((j % 5) != 0) p->drawLine(92, 0, 96, 0); p->rotate(6.0); }
同樣,我們在時鐘的邊緣繪制標記,但這一次表示分鐘。我們跳過5的倍數(shù),以避免在小時標記上方繪制分鐘標記。
====================================================
想要了解或購買Qt正版授權(quán)的朋友,歡迎
Qt技術(shù)交流群現(xiàn)已開通,QQ搜索群號“765444821”或者掃描下方二維碼即可加入
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自: