QApplication类分析

 

QApplication类分析

又一次来到Qt源代码的世界,最近太忙了,需要休息一下,明天给自己放个假,呵呵。

好了,进入今天的源代码分析。QApplication类是目前遇到的最复杂的一个类,前向声明中有这些内容:

class QSessionManager;

class QDesktopWidget;

class QStyle;

class QEventLoop;

class QIcon;

class QInputContext;

template <typename T> class QList;

class QLocale;

#if defined(Q_WS_QWS)

class QDecoration;

#endif

 

class QApplication;

class QApplicationPrivate;

class QGestureRecognizer;

包括了会话管理、桌面部件、风格、事件循环、图标、输入等类的信息。

class Q_GUI_EXPORT QApplication : public QCoreApplication

该类继承自QCoreApplication类,由于不同平台下差异很大,该类中针对不同平台定义了很多不同的对象。

提供了图形系统中所必要的一些方法:

关于显示风格、光标信息、调色板信息、字体信息、图标信息、部件信息、事件信息、状态属性信息等。

其中的构造方法和exec()方法调用了QCoreApplication中的方法,再没有过多的扩展。

接下来看下QApplicationPrivate类的方法:

qapplicaton_p.h中,还包含了QTabletDeviceData结构体,写字板驱动数据?只是猜测。该类看不明白其主要含义,继续往下看。在Windows系统下,定义了一些宏和函数指针:

#if defined(Q_WS_WIN)

typedef BOOL (WINAPI *PtrRegisterTouchWindow)(HWND, ULONG);

typedef BOOL (WINAPI *PtrGetTouchInputInfo)(HANDLE, UINT, PVOID, int);

typedef BOOL (WINAPI *PtrCloseTouchInputHandle)(HANDLE);

 

typedef BOOL (WINAPI *PtrGetGestureInfo)(HANDLE, PVOID);

typedef BOOL (WINAPI *PtrGetGestureExtraArgs)(HANDLE, UINT, PBYTE);

typedef BOOL (WINAPI *PtrCloseGestureInfoHandle)(HANDLE);

typedef BOOL (WINAPI *PtrSetGestureConfig)(HWND, DWORD, UINT, PVOID, UINT);

typedef BOOL (WINAPI *PtrGetGestureConfig)(HWND, DWORD, DWORD, PUINT, PVOID, UINT);

 

typedef BOOL (WINAPI *PtrBeginPanningFeedback)(HWND);

typedef BOOL (WINAPI *PtrUpdatePanningFeedback)(HWND, LONG, LONG, BOOL);

typedef BOOL (WINAPI *PtrEndPanningFeedback)(HWND, BOOL);

 

#ifndef WM_GESTURE

#  define WM_GESTURE 0x0119

 

#  define GID_BEGIN                       1

#  define GID_END                         2

#  define GID_ZOOM                        3

#  define GID_PAN                         4

#  define GID_ROTATE                      5

#  define GID_TWOFINGERTAP                6

#  define GID_ROLLOVER                    7

 

typedef struct tagGESTUREINFO

{

    UINT cbSize;

    DWORD dwFlags;

    DWORD dwID;

    HWND hwndTarget;

    POINTS ptsLocation;

    DWORD dwInstanceID;

    DWORD dwSequenceID;

    ULONGLONG ullArguments;

    UINT cbExtraArgs;

} GESTUREINFO;

 

#  define GC_PAN                                      0x00000001

#  define GC_PAN_WITH_SINGLE_FINGER_VERTICALLY        0x00000002

#  define GC_PAN_WITH_SINGLE_FINGER_HORIZONTALLY      0x00000004

 

#  define GC_ZOOM                                     0x00000001

#  define GC_ROTATE                                   0x00000001

 

typedef struct tagGESTURECONFIG

{

    DWORD dwID;

    DWORD dwWant;

    DWORD dwBlock;

} GESTURECONFIG;

 

#  define GID_ROTATE_ANGLE_FROM_ARGUMENT(arg) ((((double)(arg) / 65535.0) * 4.0 * 3.14159265) - 2.0*3.14159265)

 

#endif // WM_GESTURE

 

#if defined(Q_WS_WINCE_WM) && defined(QT_WINCE_GESTURES)

#undef GID_ZOOM

#define GID_ZOOM 0xf000

#undef GID_ROTATE

#define GID_ROTATE 0xf001

#undef GID_TWOFINGERTAP

#define GID_TWOFINGERTAP 0xf002

#undef GID_ROLLOVER

#define GID_ROLLOVER 0xf003

#endif

 

#endif // Q_WS_WIN

 

接下来是class QScopedLoopLevelCounter,事件等级计数器?字面翻译,不知道其最主要的作用。猜测可能与线程调度之类优先级等有关。

最后就是QApplicationPrivate类,继承自QCoreApplicationPrivate类,这里定义了不同平台下的桌面应用程序控制方法。

值得关注的方法有:graphicsSystem()方法,模态相关的方法:

static void enterModal(QWidget*);

    static void leaveModal(QWidget*);

    static void enterModal_sys(QWidget*);

    static void leaveModal_sys(QWidget*);

    static bool isBlockedByModal(QWidget *widget);

    static bool modalState();

    static bool tryModalHelper(QWidget *widget, QWidget **rettop = 0);

与多点触摸相关的方法:

QMap<int, QWidget *> widgetForTouchPointId;

    QMap<int, QTouchEvent::TouchPoint> appCurrentTouchPoints;

    static void updateTouchPointsForWidget(QWidget *widget, QTouchEvent *touchEvent);

    void initializeMultitouch();

    void initializeMultitouch_sys();

    void cleanupMultitouch();

    void cleanupMultitouch_sys();

    int findClosestTouchPointId(const QPointF &screenPos);

    void appendTouchPoint(const QTouchEvent::TouchPoint &touchPoint);

    void removeTouchPoint(int touchPointId);

    static void translateRawTouchEvent(QWidget *widget,

                                       QTouchEvent::DeviceType deviceType,

                                       const QList<QTouchEvent::TouchPoint> &touchPoints);

还有Windows下的函数指针的定义的API函数等。

好了,今天就到这里,早些休息,最近感觉很累,需要调理一下自己的身体了。

 

2009113日星期二 2306

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值