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