要想在 qml 中進行繪圖,有很多方法,
1、在我之前的部落格中,就講過如何在 qml 中使用 opengl,這是一種方法,但它要求 opengl 的基礎。
2、一種方法是使用 qpainter,它的好處是提供很多易用和實用的繪圖 api,而且在很多在 widgets 的使用的**可以直接移到qml中來使用。
3、當然還有一種方法就是使用場景圖 api,這種我了解的不多,以後再說。
先上效果圖(因為很漂亮):
可以看到,效果很不錯,接下來我開始講解如何在 qml 中使用 qpainter 的步驟:
1、繼承自 qquickpainteditem。
2、qquickpainteditem 有乙個純虛函式 paint(
qpainter
*painter),重寫它,而引數為我們提供了乙個 qpainter,使用它來進行自己的繪圖。
#ifndef magicpool_h
#define magicpool_h
#include "magicfish.h"
#include #include class magicpool : public qquickpainteditem
public slots:
void updatevalue();
void updatemove();
void movefish(qreal x, qreal y, bool hascircle);
protected:
void paint(qpainter *painter);
private:
qreal calcincludedangle(const qpointf ¢er, const qpointf &head, const qpointf &touch);
qpointf calcpoint(const qpointf &pos, qreal length, qreal angle);
qreal getlength(const qpointf &pos1, const qpointf &pos2);
private:
bool m_moving;
bool m_startcircle;
qtimer *m_circletimer;
qtimer *m_movetimer;
qtimer *m_swimtimer;
int m_circleradius;
int m_circlealpha;
qpointf m_pos;
magicfish *m_fish;
qpainterpath m_path;
qreal m_movestep;
};#endif // magicpool_h
3、使用 qmlregistertype 註冊到 qml 中使用。
#include "magicpool.h"
4、在 qml 中匯入使用。
import qtquick 2.9
import qtquick.window 2.2
import an.utility 1.0
window
magicpool
timer
}component.oncompleted: randommove();
mousearea}}
因為這裡只講如何在 qml 使用 qpainter,而具體的繪製過程有點複雜,具體可見**。
實現來自:好了,這篇其實很簡單,而且 qpainter 用起來也簡單方便,當然,在 qml 中確實也有更好的方法(也更複雜)來繪圖,但是具體喜歡哪種還是取決於個人。原理來自:
然後,附上**位址,我就放在了 qmlcontrols中了:
在 QML 中使用 C 類和物件的方法
qt 提供了兩種在 qml 環境中使用 c 物件的方式 1,在 c 中實現乙個類,註冊到 qml 環境中,qml 環境中使用該型別建立物件 2,在 c 中構造乙個物件,將這個物件設定為 qml 的上下文屬性,在 qml 環境中直接使用改屬性 從 qobject 或 qobject 的派生類繼承 使用...
Qt中使用qml的方法
1.2 註冊c 類到qml中 qmlregistertype testqt 1,0,testcontrol 其中testcontrol為c 類的名稱,testqt為qml使用的資料 當qml要使用testcontrol的類時,需要包含import testqt1.0 注意 1.在qt5.12.2中,...
Qt中使用qml的方法
1.2 註冊c 類到qml中 qmlregistertype testqt 1,0,testcontrol 其中testcontrol為c 類的名稱,testqt為qml使用的資料 當qml要使用testcontrol的類時,需要包含import testqt1.0 注意 1.在qt5.12.2中,...