Qt Creator plugin动手实践(3)C++ 类ModeManager源码分析

简介: Qt Creator plugin动手实践(3)C++ 类ModeManager源码分析

\qt-creator-opensource-src-4.8.2\src\plugins\coreplugin\modemanager.h有C++类ModeManager的定义:


class CORE_EXPORT ModeManager : public QObject
{
    Q_OBJECT
public:
    static QObject *instance();
    static IMode *currentMode();
    static IMode *mode(Id id);
    static void addAction(QAction *action, int priority);
Internal::FancyTabWidget *m_modeStack;//IDE左边整个竖条部分,包括左上方和左下方的工具栏
Internal::FancyActionBar *m_actionBar;//IDE左下方的工具栏


一、怎么添加左下方工具栏按钮?


构造函数初始化了m_actionBar,这个Bar就是指IDE左下方的工具栏。默认有运行,调试和构建三个按钮。

ModeManager::ModeManager(Internal::MainWindow *mainWindow,
                         Internal::FancyTabWidget *modeStack)
{
    m_instance = this;
    d = new ModeManagerPrivate();
    d->m_mainWindow = mainWindow;
    d->m_modeStack = modeStack;
    d->m_oldCurrent = -1;
    d->m_actionBar = new Internal::FancyActionBar(modeStack);
    d->m_modeStack->addCornerWidget(d->m_actionBar);


那我们如何添加自定义按钮呢?ModeManager的addAction就是实现添加IDE左边工具栏的函数。


语句d->m_actionBar->insertAction(index, action);是关键。


void ModeManager::addAction(QAction *action, int priority)
{
    d->m_actions.insert(action, priority);
    // Count the number of commands with a higher priority
    int index = 0;
    foreach (int p, d->m_actions) {
        if (p > priority)
            ++index;
    }
    d->m_actionBar->insertAction(index, action);
}
\src\plugins\coreplugin\fancyactionbar.cpp有函数实现:
void FancyActionBar::insertAction(int index, QAction *action)
{
    auto *button = new FancyToolButton(action, this);
    button->setIconsOnly(m_iconsOnly);
    m_actionsLayout->insertWidget(index, button);
}

自定义工具栏时,就需要在外部调用Core::ModeManager::addAction(act, p);来添加按钮。如图所示:

image.png




二、那么,左上方的<欢迎,编辑,Debug,项目和帮助>这几个按钮又是怎么来的呢?

image.png



看源码:Internal::FancyTabWidget *m_modeStack;//IDE左边整个竖条部分,包括左上方和左下方的工具栏


函数void ModeManagerPrivate::appendMode(IMode *mode)里面的m_modeStack->insertTab负责添加tab选项;


void ModeManagerPrivate::appendMode(IMode *mode)
{
    const int index = m_modeCommands.count();
    m_mainWindow->addContextObject(mode);
    m_modeStack->insertTab(index, mode->widget(), mode->icon(), mode->displayName(),
                           mode->menu() != nullptr);
    m_modeStack->setTabEnabled(index, mode->isEnabled());
FancyTabWidget::insertTab再添加widget;
void FancyTabWidget::insertTab(int index, QWidget *tab, const QIcon &icon, const QString &label, bool hasMenu)
{
    m_modesStack->insertWidget(index, tab);
    m_tabBar->insertTab(index, icon, label, hasMenu);
}

我们看到,m_modeStack->insertTab(index, mode->widget(), mode->icon(), mode->displayName(), mode->menu() != nullptr);


这里的mode是什么东东?


\src\plugins\coreplugin\imode.h有定义


class CORE_EXPORT IMode : public IContext


以下是关联的调用关系,外部初始化IMode时,就会addMode:


IMode::IMode(QObject *parent) : IContext(parent)
{
    ModeManager::instance()->addMode(this);
}
void ModeManager::addMode(IMode *mode)
{
    QTC_ASSERT(d->m_startingUp, return);
    d->m_modes.append(mode);
}
相关文章
|
4月前
Qt类结构分析
Qt类结构分析
66 3
WK
|
1月前
|
开发框架 开发工具 C++
C++跨平台框架Qt
Qt是一个功能强大的C++跨平台应用程序开发框架,支持Windows、macOS、Linux、Android和iOS等操作系统。它提供了250多个C++类,涵盖GUI设计、数据库操作、网络编程等功能。Qt的核心特点是跨平台性、丰富的类库、信号与槽机制,以及良好的文档和社区支持。Qt Creator是其官方IDE,提供了一整套开发工具,方便创建、编译、调试和运行应用程序。Qt适用于桌面、嵌入式和移动应用开发。
WK
64 5
|
2月前
|
存储 C++
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
27 2
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
|
2月前
|
存储 编译器 C语言
C++类与对象深度解析(一):从抽象到实践的全面入门指南
C++类与对象深度解析(一):从抽象到实践的全面入门指南
51 8
|
3月前
|
编解码 开发工具 UED
QT Widgets模块源码解析与实践
【9月更文挑战第20天】Qt Widgets 模块是 Qt 开发中至关重要的部分,提供了丰富的 GUI 组件,如按钮、文本框等,并支持布局管理、事件处理和窗口管理。这些组件基于信号与槽机制,实现灵活交互。通过对源码的解析及实践应用,可深入了解其类结构、布局管理和事件处理机制,掌握创建复杂 UI 界面的方法,提升开发效率和用户体验。
188 12
|
3月前
|
IDE 开发工具 C++
qt creator + vs2019编译记录
本文记录了作者在使用qt creator和vs2019编译项目时遇到的困难和解决方案,包括编译环境设置、qt creator编译脚本的成功案例、不带Ninja的编译脚本问题、错误示范以及相关参考链接。
qt creator + vs2019编译记录
|
3月前
|
C++
c++继承层次结构实践
这篇文章通过多个示例代码,讲解了C++中继承层次结构的实践应用,包括多态、抽象类引用、基类调用派生类函数,以及基类指针引用派生类对象的情况,并提供了相关的参考链接。
|
4月前
|
存储 C++
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
|
3月前
|
设计模式 前端开发 安全
Qt注册类对象单例与单类型区别
在进行开发时,应当根据具体的应用场景和需求来选择使用单例模式或是单类型。如果是全局服务或状态管理,可能需要单例模式;如果是为了使QML环境下的不同组件能够访问到同一个后端服务对象,则可能需要使用单类型。
45 2
|
4月前
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
192 2