Loading... 一直想整个图形绘制工具,但是考虑到直接解析SVG的话,不好对SVG对象进行实时交互,所以就有了该系列文章,看看Qt自带的designer是怎么实现的,然后学习之~ # 一、源码结构与子项目定位 从Qt官网下载qt-everywhere-src-版本号.zip源码文件后,解压。 其根目录下qttools为本次分析目标。 使用QtCreator打开qttool.pro项目文件,即可得到如下图所示项目结构:  其中`src->designer`源码为重点分析目标。 其目录结构如下:  接下来,优先分析`Headers`和`Sources`目录下源码。 # 二、designer启动流程 main.cpp中main函数: ```c++ int main(int argc, char *argv[]) { Q_INIT_RESOURCE(designer); QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); // required for QWebEngineView QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts); QDesigner app(argc, argv); //外层对象 //arg解析 switch (app.parseCommandLineArguments()) { case QDesigner::ParseArgumentsSuccess: break; case QDesigner::ParseArgumentsError: return 1; case QDesigner::ParseArgumentsHelpRequested: return 0; } QGuiApplication::setQuitOnLastWindowClosed(false); return QApplication::exec(); } ``` 继续看QDesigner实现: ```c++ //qdesigner.h //静态类指针获取 #define qDesigner \ (static_cast<QDesigner*>(QCoreApplication::instance())) class QDesignerWorkbench; class QDesignerToolWindow; class MainWindowBase; class QDesignerServer; class QDesignerClient; class QErrorMessage; class QCommandLineParser; struct Options; class QDesigner: public QApplication { Q_OBJECT public: enum ParseArgumentsResult { ParseArgumentsSuccess, ParseArgumentsError, ParseArgumentsHelpRequested }; QDesigner(int &argc, char **argv); ~QDesigner() override; //参数 ParseArgumentsResult parseCommandLineArguments(); //工作区->界面交互定义 QDesignerWorkbench *workbench() const; //服务端,暂不清楚干啥 QDesignerServer *server() const; //主窗口基类 MainWindowBase *mainWindow() const; //设置主窗口 void setMainWindow(MainWindowBase *tw); protected: bool event(QEvent *ev) override; signals: void initialized(); public slots: void showErrorMessage(const char *message); private slots: void callCreateForm(); private: void showErrorMessageBox(const QString &); QDesignerServer *m_server; QDesignerClient *m_client; QDesignerWorkbench *m_workbench; QPointer<MainWindowBase> m_mainWindow; QPointer<QErrorMessage> m_errorMessageDialog; QString m_initializationErrors; QString m_lastErrorMessage; bool m_suppressNewFormShow; }; QT_END_NAMESPACE #endif // QDESIGNER_H ``` 可以断定,QDesigner是个App管理类,负责前台窗口、后台server维护以及基本的消息处理。 继续看`QDesignerWorkbench`: ```c++ class QDesignerWorkbench: public QObject { Q_OBJECT public: QDesignerWorkbench(); ~QDesignerWorkbench() override; UIMode mode() const; QDesignerFormEditorInterface *core() const; QDesignerFormWindow *findFormWindow(QWidget *widget) const; QDesignerFormWindow *openForm(const QString &fileName, QString *errorMessage); QDesignerFormWindow *openTemplate(const QString &templateFileName, const QString &editorFileName, QString *errorMessage); int toolWindowCount() const; QDesignerToolWindow *toolWindow(int index) const; int formWindowCount() const; QDesignerFormWindow *formWindow(int index) const; QDesignerActions *actionManager() const; QActionGroup *modeActionGroup() const; QRect availableGeometry() const; QRect desktopGeometry() const; int marginHint() const; bool readInForm(const QString &fileName) const; bool writeOutForm(QDesignerFormWindowInterface *formWindow, const QString &fileName) const; bool saveForm(QDesignerFormWindowInterface *fw); bool handleClose(); bool readInBackup(); void updateBackup(QDesignerFormWindowInterface* fwi); void applyUiSettings(); signals: void modeChanged(UIMode mode); void initialized(); public slots: void addFormWindow(QDesignerFormWindow *formWindow); void removeFormWindow(QDesignerFormWindow *formWindow); void bringAllToFront(); void toggleFormMinimizationState(); private slots: void switchToNeutralMode(); void switchToDockedMode(); void switchToTopLevelMode(); void initializeCorePlugins(); void handleCloseEvent(QCloseEvent *); void slotFormWindowActivated(QDesignerFormWindow* fw); void updateWindowMenu(QDesignerFormWindowInterface *fw); void formWindowActionTriggered(QAction *a); void adjustMDIFormPositions(); void minimizationStateChanged(QDesignerFormWindowInterface *formWindow, bool minimized); void restoreUISettings(); void notifyUISettingsChanged(); void slotFileDropped(const QString &f); private: QWidget *magicalParent(const QWidget *w) const; Qt::WindowFlags magicalWindowFlags(const QWidget *widgetForFlags) const; QDesignerFormWindowManagerInterface *formWindowManager() const; void closeAllToolWindows(); QDesignerToolWindow *widgetBoxToolWindow() const; QDesignerFormWindow *loadForm(const QString &fileName, bool detectLineTermiantorMode, QString *errorMessage); void resizeForm(QDesignerFormWindow *fw, const QWidget *mainContainer) const; void saveGeometriesForModeChange(); void saveGeometries(QDesignerSettings &settings) const; bool isFormWindowMinimized(const QDesignerFormWindow *fw); void setFormWindowMinimized(QDesignerFormWindow *fw, bool minimized); void saveSettings() const; QDesignerFormEditorInterface *m_core; QDesignerIntegration *m_integration; QDesignerActions *m_actionManager; QActionGroup *m_windowActions; QMenu *m_windowMenu; QMenuBar *m_globalMenuBar; struct TopLevelData { ToolBarManager *toolbarManager; QVector<QToolBar *> toolbars; }; TopLevelData m_topLevelData; UIMode m_mode; DockedMainWindow *m_dockedMainWindow; QVector<QDesignerToolWindow *> m_toolWindows; QVector<QDesignerFormWindow *> m_formWindows; QMenu *m_toolbarMenu; // Helper class to remember the position of a window while switching user // interface modes. class Position { public: Position(const QDockWidget *dockWidget); Position(const QMdiSubWindow *mdiSubWindow, const QPoint &mdiAreaOffset); Position(const QWidget *topLevelWindow, const QPoint &desktopTopLeft); void applyTo(QMdiSubWindow *mdiSubWindow, const QPoint &mdiAreaOffset) const; void applyTo(QWidget *topLevelWindow, const QPoint &desktopTopLeft) const; void applyTo(QDockWidget *dockWidget) const; QPoint position() const { return m_position; } private: bool m_minimized; // Position referring to top-left corner (desktop in top-level mode or // main window in MDI mode) QPoint m_position; }; typedef QHash<QWidget*, Position> PositionMap; PositionMap m_Positions; enum State { StateInitializing, StateUp, StateClosing }; State m_state; bool m_uiSettingsChanged; // UI mode changed in preference dialog, trigger delayed slot. }; ``` 下期具体分析`QDesignerWorkbench`代码细节和执行流程。 最后修改:2021 年 09 月 26 日 08 : 25 PM © 禁止转载