Qt项目实战杂谈一二:网页/应用嵌入技术

本文探讨了软件平台化的趋势,以及在已有软件基础上进行应用嵌入的技术细节。作者提到,为了减少开发工作量和保持界面统一,许多公司选择最小改动地将应用集成到平台。重点讨论了网页和应用的嵌入实现,包括稳定性、优雅退出和异常处理。文中提及WPS作为案例,分析其可能使用的cef和webkit技术,并猜测其应用嵌入方式。作者计划在后续文章中详细阐述实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这一篇,应该说是满满的诚意了。很早之前就有完成此篇的打算,奈何一直没有时间。要么是沉迷于编码无法自拔,要么就是执着于释放身心的游戏而偷偷爽快不已。今天,我们说说老牌软件的一个趋势,和对应的某些技术细节的实现点。可能有点长,看这写吧。过长可能会考虑分篇章。

首先我们可以认识到这个趋势,国内对于自主研发基础软件的形式欣欣向荣。等到基础软件开发到一定阶段,平台化是很多软件厂商选择的一个方向。谁能精心雕琢、浑然天成的先集成最优秀的软件模块到自己平台(不管是自己开发还是买买买),就有可能打造国内航母级的工业(云)软件平台。

我们就只谈谈技术方面吧。老牌的公司,有一些沉淀了,也有几款自己不错的基础软件,这时候就可能想到如何把自己已有的这些软件集成到一个平台上来。是类似应用商店的存在,但又不仅仅是应用商店。不仅支持应用的自主上下架发布、授权管理等等等等,应用还能支持数据上云、多应用间拓展交互等等(当然这也是平台化的好处和亮点)。

已有应用的平台化是需要的,但是非必须。对于平台的整体体验来说,一些公司应该会考虑到应用界面的统一管理,并且最大程度减少平台化开发工作量,避免应用重构,往往会选择在已有的应有基础上做最小的改动。这时候不得不考虑到已有应用界面嵌入到平台的问题了。

在这里插入图片描述

具体嵌入怎么实现?怎样保证嵌入的应用方式稳定?又怎样保证嵌入的应用能够优雅退出? 嵌入的应用异常崩溃如何能保证不影响平台客户端呢?这里面涉及到比较多的问题,经过这段时间的摸爬滚打,这一套处理博主基本已经得心应手~ 具体的实现后续再开一篇讲一下。

平台客户端的集成差不多都是这个套路。说到底目前都有两个绕不过的技术方案:
在这里插入图片描述
我们对成熟的平台软件分析,很容易得到一些技术上的启发。譬如wps,网页嵌入必然使用的是cef,当前部分页面的展示可能也用到了webkit。
应用上的嵌入,wps的excel、ppt 等很明显是独立应用,启动之后却能在一个客户端上展示,这里猜想无非有两种方式:一种是启动之后嵌入,另一种就是excel.exe 之类的只是触发了启动的请求,真正通知启动的还是平台(没有具体研究,但是觉得这种穿裤子差屁股的方式应该不会是。),所以启动后嵌入应用的可能性极大。

肚子饿了,干饭去。后续再聊~

随便贴点东西,啥dn说审核不过也不知道原因。

#include <windows.h>

class ActionDelayPolicy_NoWait;

class ActionBase // Only needed if you want to use polymorphically different actions
{
public:
    virtual ~ActionBase() {}
    virtual void run() = 0;
};

template < typename Command, typename DelayPolicy = ActionDelayPolicy_NoWait >
class Action : public DelayPolicy, public Command,public ActionBase
{
public:
    virtual void run() {
        DelayPolicy::wait(); // inherit wait from DelayPolicy
        Command::execute();  // inherit command to execute
    }
};


class Action2:public ActionBase{
public:
    virtual void run(){
        cout << "start running ." << endl;
    }
};

// Real executed code can be written once (for each action to execute)
class CommandSalute
{
public:
    void execute() { std::cout << "Hi!" << std::endl; }
};

class CommandSmile
{
public:
    void execute() { std::cout << ":)" << std::endl; }
};

// And waiting behaviors can be defined separatedly:
class ActionDelayPolicy_NoWait
{
public:
    void wait() const {}
};

// Note that as Action inherits from the policy, the public methods (if required)
// will be publicly available at the place of instantiation
class ActionDelayPolicy_WaitSeconds
{
public:
    ActionDelayPolicy_WaitSeconds() : seconds_( 0 ) {}
    void wait() const { ::Sleep( seconds_ ); }
    void wait_period( int seconds ) { seconds_ = seconds; }
    int wait_period() const { return seconds_; }
private:
    int seconds_;
};

// Polimorphically execute the action
template <typename Action>
void execute_action( Action& action )
{
    action.run();
}


// Now the usage:
int main()
{
    // 基于模板函数实现的静态多态
    Action< CommandSalute > salute_now;
    execute_action( salute_now );

    Action< CommandSmile, ActionDelayPolicy_WaitSeconds > smile_later;
    smile_later.wait_period( 2000); // Accessible from the wait policy through inheritance
    execute_action( smile_later );

}
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

键盘会跳舞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值