翻譯|使用教程|編輯:鮑佳佳|2021-03-29 10:57:08.457|閱讀 210 次
概述:模擬時鐘窗口示例顯示了如何繪制自定義窗口的內(nèi)容。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
Qt是一個跨平臺框架,通常用作圖形工具包,它不僅創(chuàng)建CLI應(yīng)用程序中非常有用。而且它也可以在三種主要的臺式機操作系統(tǒng)以及移動操作系統(tǒng)(如Symbian,Nokia Belle,Meego Harmattan,MeeGo或BB10)以及嵌入式設(shè)備,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);
}
我們在窗口上設(shè)置標(biāo)題,并將其大小調(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);
在我們設(shè)置畫家并繪制時鐘之前,我們首先定義兩個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坐標(biāo),并確保這些坐標(biāo)位于窗口最短邊的長度內(nèi)。
為了使我們的代碼更簡單,我們將繪制一個固定大小的鐘面,將其定位和縮放,使其位于窗口的中心。
我們還確定了窗口最短邊的長度,這樣我們就可以把鐘面放在窗口內(nèi)。
畫家負責(zé)處理渲染過程中的所有轉(zhuǎn)換,并確保一切都能正確繪制。讓畫家處理變換通常比進行手工計算更容易。
	 
我們首先使用公式繪制時針,該公式將坐標(biāo)系逆時針旋轉(zhuǎn)由當(dāng)前小時和分鐘確定的度數(shù)。這意味著將顯示指針順時針旋轉(zhuǎn)所需的量。
  p->setPen(Qt::NoPen);
    p->setBrush(hourColor);
我們將筆設(shè)置為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();
我們要保存和恢復(fù)旋轉(zhuǎn)前后的變換矩陣,因為我們希望放置分針而不必考慮任何先前的旋轉(zhuǎn)。
    p->setPen(hourColor);
    for (int i = 0; i < 12; ++i) {
        p->drawLine(88, 0, 96, 0);
        p->rotate(30.0);
    }
我們每小時在時鐘的邊緣繪制一個標(biāo)記。我們繪制每個標(biāo)記,然后旋轉(zhuǎn)坐標(biāo)系,以便畫家準(zhǔn)備下一個標(biāo)記。
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);
    }
同樣,我們在時鐘的邊緣繪制標(biāo)記,但這一次表示分鐘。我們跳過5的倍數(shù),以避免在小時標(biāo)記上方繪制分鐘標(biāo)記。
====================================================
想要了解或購買Qt正版授權(quán)的朋友,歡迎
Qt技術(shù)交流群現(xiàn)已開通,QQ搜索群號“765444821”或者掃描下方二維碼即可加入
	 
	
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@ke049m.cn
文章轉(zhuǎn)載自: