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函数等。
好了,今天就到这里,早些休息,最近感觉很累,需要调理一下自己的身体了。
2009年11月3日星期二 23:06