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

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

最后,我们再追溯一下前面提到的void ModeManagerPrivate::appendMode(IMode *mode)是哪里调用的?


我们挨个函数挨个函数的向源头追溯,得知:


void ModeManagerPrivate::extensionsInitializedHelper()
{
    for (IMode *mode : m_modes)
        appendMode(mode);
ModeManager::extensionsInitialized()
void ModeManager::extensionsInitialized()
{
    d->extensionsInitializedHelper();
}
MainWindow::extensionsInitialized()
void MainWindow::extensionsInitialized()
{
    ModeManager::extensionsInitialized();
void CorePlugin::extensionsInitialized()
void CorePlugin::extensionsInitialized()
{
    m_mainWindow->extensionsInitialized();

最后的void CorePlugin::extensionsInitialized(),在


class EXTENSIONSYSTEM_EXPORT IPlugin类的定义是纯虚函数,需要用户在外部自己实现。


virtual void extensionsInitialized() = 0;


以上就是Qt Creator插件的实现原理。



三、早期的Qt Creator版本在插件接口定义上有不同之处,比如Qt Creator 3.2源码ModeManager有addWidget函数。


class CORE_EXPORT ModeManager : public QObject
{
    static void addWidget(QWidget *widget);



通过addWidget函数可以实现如下效果:

image.png



以下源码从开源项目摘录 https://github.com/lexxmark/QtCreator-JsExtensions-Plugin


/jep_plugins/JepUtils.js
/jep_plugins/ModePanelButtons/ModePanelButtons.jep.js
function createActionToolButton(actionName) {
    // look for an action
    var cmd = actionManager.command(actionName);
    if (cmd === null) {
        jepAPI.debug("Cannot find such action: " + actionName);
        return null;
    }
    // get action
    var action = cmd.action();
    // create button
    var bttn = jepAPI.createQObject("QToolButton", null);
    // tune button
    bttn.toolButtonStyle = 2;
    bttn.autoRaise = true;
    bttn.styleSheet = "QToolButton {color: black; }";
    // disable button's minimum width
    bttn.sizePolicy = jepAPI.sizePolicy(13, 0, 1);
    // assign action
    bttn.setDefaultAction(action);
    return bttn;
}
 // add action buttons to mode panel
    settings.actions.map(function (actionName) {
        var bttn = createActionToolButton(actionName);
        if (bttn)
            modeManager.addWidget(bttn);
    });

总之,Qt Creator 4.8.2版本没有ModeManager::addWidget函数,想添加自定义按钮只能通过ModeManager::addAction实现。


相关文章
|
4月前
Qt类结构分析
Qt类结构分析
64 3
WK
|
19天前
|
开发框架 开发工具 C++
C++跨平台框架Qt
Qt是一个功能强大的C++跨平台应用程序开发框架,支持Windows、macOS、Linux、Android和iOS等操作系统。它提供了250多个C++类,涵盖GUI设计、数据库操作、网络编程等功能。Qt的核心特点是跨平台性、丰富的类库、信号与槽机制,以及良好的文档和社区支持。Qt Creator是其官方IDE,提供了一整套开发工具,方便创建、编译、调试和运行应用程序。Qt适用于桌面、嵌入式和移动应用开发。
WK
51 5
|
2月前
|
存储 C++
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
25 2
【C++篇】C++类和对象实践篇——从零带你实现日期类的超详细指南
|
2月前
|
存储 编译器 C语言
C++类与对象深度解析(一):从抽象到实践的全面入门指南
C++类与对象深度解析(一):从抽象到实践的全面入门指南
50 8
|
3月前
|
编解码 开发工具 UED
QT Widgets模块源码解析与实践
【9月更文挑战第20天】Qt Widgets 模块是 Qt 开发中至关重要的部分,提供了丰富的 GUI 组件,如按钮、文本框等,并支持布局管理、事件处理和窗口管理。这些组件基于信号与槽机制,实现灵活交互。通过对源码的解析及实践应用,可深入了解其类结构、布局管理和事件处理机制,掌握创建复杂 UI 界面的方法,提升开发效率和用户体验。
174 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环境下的不同组件能够访问到同一个后端服务对象,则可能需要使用单类型。
41 2
|
4月前
|
C++
C++ Qt开发:QUdpSocket网络通信组件
QUdpSocket是Qt网络编程中一个非常有用的组件,它提供了在UDP协议下进行数据发送和接收的能力。通过简单的方法和信号,可以轻松实现基于UDP的网络通信。不过,需要注意的是,UDP协议本身不保证数据的可靠传输,因此在使用QUdpSocket时,可能需要在应用层实现一些机制来保证数据的完整性和顺序,或者选择在适用的场景下使用UDP协议。
168 2