当前位置: 首页 > news >正文

Qt 的发展历史、现状与启示

Qt 最早在1991年由挪威的两位程序员 Eirik Chambe-Eng 和 Haavard Nord 开发,他们在1994年创立 Trolltech 公司(奇趣科技)正式经营软件业务。Qt 的第一个公众预览版于1995年面世,之后在2008年被诺基亚收购;2011年到2012年,在诺基亚全面转向微软系后,将 Qt 软件业务出售给了芬兰 IT 服务公司 Digia;2016年,Qt 公司从 Digita 独立出来并在芬兰上市;2017年获得 1500 万欧元投资;2018年在坚持了20多年后,Qt 终于迎来了物联网时代,在智能汽车、智能制造业等领域变得愈发重要。

初创阶段

Haavard 和 Eirik 相识于特隆赫姆(Trondheim)的挪威科技学院,这也是他们获得计算机科学硕士学位的地方。1988年,一家瑞典公司委派 Haavard 开发一套 C++ 的用户界面框架,从此,Haavard 对 C++ 用户界面开发产生了浓厚兴趣。

两年后,1990年夏天,Haavard 与 Eirik 一起在特隆赫姆医院从事超声设备的软件开发,开发一个基于 C++ 的超声图像数据库系统。这个系统需要在 Unix、Macintosh 和 Windows 系统上运行,并带有图形用户界面。这个夏天的一天,Haavard 和 Eirik 外出享受阳光,他们坐在公园长椅上,Haavard 说:“我们需要一个面向对象的显示系统。” 这场讨论是面向对象的跨平台图形用户界面框架的理论基础,而他们也将投入于创建这一框架。可以说,正是由于对当时跨平台软件开发工具的不满意,他们才决定开发 Qt。

1991年,Haavard 和 Eirik 开始合作构建 Qt,Eirik 负责设计,Haavard 则编写最终成为 Qt 的那些类。之后的一年,Eirik 提出了“信号和槽”的构想,这是一个简单但功能强大的图形用户界面编程规范,如今已被多个工具包实现。Haavard 接受了这一构想并进行了代码实现。1993年,Haavard 和 Eirik 开发出了 Qt 的第一个图形内核类并用以实现他们自己的窗口部件。1993年底,Haavard 建议进军商业领域,从而创建“世界上最好的 C++ 图形用户界面开发框架”。

1994年3月4日,Haavard 和 Eirik 共同创立了 Quasar Technologies 公司,后更名为 Troll Tech,也就是后面人们熟知的 Trolltech(奇趣科技)。对于这两位年轻的程序员来说,1994年的开始是不幸的,他们想进入一个稳定的市场,却没有客户和资金,只有一个未完成的产品。幸运的是,他们的妻子都有工作,可以支撑他们进行两年的产品开发。Eirik 和 Haavard 预计两年后就可以开始赚钱了。

至于为什么这个图形框架取名为“Qt”,是因为字母 Q 在 Haavard 的文本编辑器 Emacs 字体上看起来非常完美,因此“Q”被选作了类名的前缀。同时,受 Xt(XToolkit 的缩写)的启发,又添加了字母“t”,代表工具包(Toolkit)。

1995年4月,在 Haavard 一个大学教授的介绍下,一家挪威公司 Metis 雇佣他们使用 Qt 开发软件。几乎与此同时,奇趣科技招聘了 Arnt Gulbrandsen。在奇趣科技的六年里,Arnt 设计实现了独具特色的文档系统,对 Qt 的代码也做出了不少贡献。

1995年5月20日,在 sunsite.unc.edu 上传了 Qt 0.90 版本。六天后,Qt 的发行版本发布在 comp.os.linux.announce 上。这是 Qt 的首个公开发行版本。Qt 可以用于进行 Windows 和 Unix 系统开发,并在两个系统平台上提供相同的应用程序接口(API)。从第一天起,Qt 就提供了两种授权许可版本:用于商业开发的商业许可版和用于开源开发的免费版本。Metis 的合同保证了奇趣科技的正常发展,然而,在之后的十个月里再没有一个人购买 Qt 的商业许可协议。

1996年3月,欧洲太空总署成为了 Qt 的第二个用户,并购买了 10 个 Qt 的商业许可协议。凭着坚定的信念,Eirik 和 Haavard 又雇佣了其他开发人员。5月底,Qt 0.97 版本发布;9月24日,Qt 1.0 版本发布;同年年底,Qt 已经发布到了 1.1 版本。来自不同国家的八个用户购买了 18 个许可协议。也是在这一年,在 Matthias Ettrich 带领下,开始了 KDE 项目。

Qt 1.2 版本于1997年4月发布。Matthias Ettrich 用 Qt 构建 KDE 的决定帮助 Qt 成为 Linux 系统上开发 C++ 图形用户界面的事实标准。1997年9月,Qt 1.3 版本发布。

Matthias 于1998年加入奇趣科技,9月份,Qt 1.x 的最后一个主版本 1.40 版发布。1999年6月,Qt 2.0 发布。Qt 2 有一个新的开源许可协议 —— Q公共许可协议(Q Public License,QPL),它与开源的定义一致。1999年8月,Qt 赢得了 LinuxWorld 的最佳库/工具奖,开始受到投资者的广泛关注,并在2000年互联网泡沫破灭之前获得了 800 万美元的资金。与此同时,奇趣科技有限公司(澳大利亚)(Trolltech Pty Ltd)成立。

奇趣科技在2000年发布了 Qt/Embedded Linux。它被设计作为 X11 的轻量级替代产品,运行于嵌入式 Linux 系统设备,并提供窗口系统。Qt/X11 和 Qt/Embedded Linux 不仅提供了商业许可协议,还提供了被广泛应用的 GNU 公用许可协议(General Public License,GPL)。2000年年底,奇趣科技有限公司(美国)(Trolltech Inc)成立,并发布了 Qtopia 的首个版本。Qtopia 是应用于移动电话和掌上电脑(PDA)的应用软件平台。Qt/Embedded Linux 在2001和2002年连续两年赢得了 LinuxWorld 的“最佳嵌入式 Linux 解决方案奖”,Qtopia Phone 在2004年获得了相同奖项。

2001年,Qt 3.0 版本发布。Qt 已经可以应用于 Windows、MacOS X、Unix 和 Linux(桌面系统和嵌入式系统)系统。Qt 3 提供了 42 个新的类,代码行也超过了 500000 行。Qt 3 在 Qt 2 的基础上迈进了一大步,在很多方面进行了重大改进,主要包括本地化、统一字符编码标准(Unicode)支持、一个全新的文本编辑查看部件以及一个类似于 Perl 的正则表达式类。Qt 3 在2002年获得了 SoftwareDevelopment Times 的"Jolt Productivity Award"。

2005年夏天,Qt 4.0版本发布。Qt 4 较之前版本更加全面和丰富,共有大约 500 个类和 9000 多个函数。Qt 被分成了几个不同的函数库,开发人员只需要链接他们用到的那部分即可。Qt 4 在前续版本上进行了重大改进,包括一套全新的高效易用的模板容器、高级的模型/视图功能、灵活高速的二维绘制框架、强大的 Unicode 文本读写类以及对 Qt 类进行的数以千计的功能增强。伴随着 Qt 应用范围的扩大,Qt 已不仅仅是一个图形用户界面工具包,俨然发展成一个成熟的应用开发框架。Qt 4 也是首个在其支持的所有平台上既能进行商业开发又能进行开源开发的 Qt 版本。

同样是在2005年,奇趣科技在北京成立了办事处,以发展中国客户,并提供 Qt/Embedded Linux 和 Qtopia 的销售服务、培训及技术支持。

通过一些非官方的语言绑定件,非 C++ 程序员也早就开始使用 Qt 了,尤其是 Python 程序员使用的 PyQt。2007年,针对 C# 程序员发布了 Qyoto 非官方绑定件。同年,奇趣科技正式推出了 Qt Jambi,这是一个官方支持的 Java 版 Qt 应用编程接口。

自奇趣科技诞生以来,其推广普及就从未减弱过,时至今日仍在快速增长。Qt 的成功反映了 Qt 的品质和其易用性。多年来,Qt 已成为世界领先的软件开发框架之一,如今已成为跨各种平台创建应用程序的行业标准,在全世界拥有数以千计用户和数以万计的开源开发者的产品。

Nokia 阶段

诺基亚(Nokia)曾是全球手机市场的霸主,但自从2007年 iPhone 掀起的智能手机革命,加上 Android 的出现,诺基亚逐渐走向衰落。

2008年,诺基亚以 1.53 亿美元收购奇趣科技并将其改名为 Qt Software,以加速诺基亚针对移动终端和桌面应用跨平台的软件战略的实施,以及拓展其互联网服务业务。2009年8月,Qt Software 再次改名为 Qt Development Frameworks(Qt 开发框架)。

从正式发布开始,Qt 就提供了两种授权许可版本,即适用于商业项目的商业许可版和适用于开源项目的 GPL 许可。2009年1月,诺基亚宣布 Qt 支持 LGPL 2.1 授权,将其推向开源。这实质上是为了让更多开发人员可以免费使用它,虽然仍有一些模块使用不开源的 Qt 授权。(LGPL 授权的限制强度处于 GPL 和 BSD 之间,也为 Mozilla 和 OpenOffice 等开源软件所采用的许可证)

在此期间,诺基亚联合英特尔利用 Qt 开发了全新的智能手机系统 MeeGo,可惜遭遇了微软木马屠城,诺基亚最终被迫放弃了 MeeGo,而 Qt 商业授权业务也于2011年3月出售给了芬兰 IT 服务公司 Digia。2011年第二季度,诺基亚被苹果和三星双双超越,在智能手机市场的销量落后于苹果及三星的手机,而在低端手机市场,又无法制住其它的亚洲竞争对手。2013年9月3日,微软宣布将以 72亿美元收购诺基亚手机制造等业务;2014年11月,诺基亚宣布不会再制造手机。

Digia 阶段

2011年至2012年间,芬兰 IT 服务公司 Digia Oyj 从诺基亚收购所有 Qt 业务,并计划使 Qt 支持 Android、iOS 和 Windows 8,大力推广移动平台开发和商业应用。

2014年9月,Digia 宣布成立 Qt Company 全资子公司,独立运营 Qt 商业授权业务。2016年3月,Qt 公司(Qt Group)被 Digia 分拆为独立公司,并于同年5月在赫尔辛基证券交易所挂牌上市。经历艰难曲折,Qt 终于算是步入正轨了。

如今,Qt 依然提供了 GPL、LGPL 和 Commercial 三种授权协议。根据公开资料,Qt 目前在全球12个国家拥有近700名员工(其中300名研发),2022财年销售收入 1.55 亿欧元。

扩展阅读

  • About Qt - Qt Wiki
  • Qt History - Qt Wiki
  • Qt version history - Qt Wiki
  • Qt (software) - 维基百科
  • Qt Project - 维基百科
  • 诺基亚 - 维基百科

相关文章:

Qt 的发展历史、现状与启示

Qt 最早在1991年由挪威的两位程序员 Eirik Chambe-Eng 和 Haavard Nord 开发,他们在1994年创立 Trolltech 公司(奇趣科技)正式经营软件业务。Qt 的第一个公众预览版于1995年面世,之后在2008年被诺基亚收购;2011年到201…...

Quiet-STaR:让语言模型在“说话”前思考

大型语言模型(llm)已经变得越来越复杂,能够根据各种提示和问题生成人类质量的文本。但是他们的推理能力让仍然是个问题,与人类不同LLM经常在推理中涉及的隐含步骤中挣扎,这回导致输出可能在事实上不正确或缺乏逻辑。 考虑以下场景:正在阅读一…...

【Kotlin】匿名类和伴生类

1 匿名类 1)无继承 fun main() {var obj object {var name: String "zhang"override fun toString(): String {return name}}println(obj) // zhang } 2)有继承 fun main() {var obj object: People {var name: String "zhang"…...

【机器学习算法介绍】(3)决策树

决策树是一种常见的机器学习算法,用于分类和回归任务。它模拟了人类决策过程,通过一系列的问题来引导决策。决策树的构建涉及三个主要步骤:特征选择、树的构建和树的剪枝。 1. 特征选择 特征选择是决策树构建过程中的第一步,目的…...

算法之查找

1、顺序查找: package com.arithmetic.search; //顺序查找 //sequentialSearch 方法接收一个整数数组和一个目标元素作为参数,并使用顺序查找的方式在数组中查找目标元素。 //它通过循环遍历数组元素,逐个与目标元素比较,如果找到…...

LInux脚本学习

1.注释 #单行注释 以 # 字符开头就是单行注释 当然第一行除外,比较特殊 2.多行注释 3.Shell文件的作用 Shell文件就是linux命令集 4.sh脚本的执行方式 bash xxx.sh 5.新建的文件会没有执行权限 #为文件赋予执行权限 chmod ux xxx.sh 6.编写规范 #!/bin/bash #…...

JavaWeb基础(计网 socket 数据库 JDBC lombok Mybatis JUnit Maven)

本文用于检验学习效果,忘记知识就去文末的链接复习 1. 网络基础 1.1 计网基础 区分设备:IP地址 区分网络:网络地址 网络互联:路由器 主机上进程间通信:端口 http是常用的协议,基于TCP协议 TCP VS U…...

【HBase】

什么是HBase HBase是Google Bigtable的开源实现,类似Google Bigtable利用GFS作为其文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统;Google运行MapReduce来处理Bigtable中的海量数据,HBase同样利用Hadoop MapReduce来处理HBase中的海量数据。 访问层次(数据…...

Vue3:使用Pinia存储、读取、修改数据

一、存储数据 Pinia插件中,存储数据的配置项是state count.ts import {defineStore} from piniaexport const useCountStore defineStore(count,{// 真正存储数据的地方state(){return {sum:6}} })loveTalk.ts import {defineStore} from piniaexport const use…...

基于 Quartz.NET 可视化任务调度平台 QuartzUI

一、简介 QuartzUI 是基于 Quartz.NET3.0 的定时任务 Web 可视化管理,Docker 打包开箱即用、内置 SQLite 持久化、语言无关、业务代码零污染、支持 RESTful 风格接口、傻瓜式配置、异常请求邮件通知等。 二、部署 QuartzUI 从 2022 年到现在没有提交记录&#xf…...

前端三剑客 —— CSS (第三节)

目录 上节回顾: 1.CSS使用有以下几种样式; 2.选择器 1.基本选择器 2.包含选择器 3.属性选择器 [] 4.伪类选择器 : 5.伪元素选择器 ::before :after 3.常见样式的使用 常见样式参考表 一些特殊样式 媒体查询 自定义字体 变换效果 translate&…...

C# 系统学习(异步编程)

在C#中,异步编程是一种优化程序性能的关键技术,特别是在处理I/O密集型操作(如网络请求、数据库查询、文件读写等)时,能够有效避免由于长时间等待而导致的线程阻塞,从而提高应用的响应速度和资源利用率。asy…...

前端工程师————CSS学习

选择器分类 选择器分为基础选择器和复合选择器 基础选择器包括:标签选择器,类选择器,id选择器,通配符选择器标签选择器 类选择器 语法:.类名{属性1: 属性值;} 类名可以随便起 多类名使用方式&am…...

C# 登录界面代码

背景 MVVM 是一种软件架构模式,用于创建用户界面。它将用户界面(View)、业务逻辑(ViewModel)和数据模型(Model)分离开来,以提高代码的可维护性和可测试性。 MainWindow 类是 View&a…...

点云的Python均值采样

一、代码 Python import numpy as np import open3d as o3ddef mean_sampling(point_cloud, num_samples=None, depth=None, method=knn, k=10):"""对点云进行均值下采样。:param point_cloud: Open3D PointCloud对象:param num_samples: (仅当method=knn时使…...

xss-labs 11-13通关记录

前言 最近复习xss知识&#xff0c;整理一下xss的绕过思路。 level11 观察测试: 1.四个隐藏参数标签 2.全部get传参一遍发现t_sort可赋值&#xff0c;使用的是get传参 3.针对t_sort测试过滤的字符 t_sort< > & ; " 检测到他除了<>,别的全部过滤。 因为…...

Unity类银河恶魔城学习记录12-2 p124 Character Stats UI源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili UI_Statslot.cs using System.Collections; using System.Collections.Gen…...

技术揭秘:如何打造完美互动的充电桩硬件与服务平台?

充电桩平台全套源码地址 https://gitee.com/chouleng/cdzkjjh.git 这张图像是一个系统或服务的架构图。以下是对图中各个部分的描述&#xff1a; 前端&#xff1a; 位于图像的顶部&#xff0c;颜色为浅绿色。用户服务端&#xff1a; 紧邻前端&#xff0c;颜色为淡黄色。设备服…...

【Django学习笔记(四)】JavaScript 语言介绍

JavaScript 语言介绍 前言正文1、JavaScript 小案例2、代码位置2.1 在当前 HTML 文件中2.2 在其他 js 文件中 3、代码注释3.1 HTML的注释3.2 CSS的注释3.3 Javascript的注释 4、变量 & 输出4.1 字符串4.2 数组4.3 对象(python里的字典) 5、条件语句6、函数7、DOM7.1 根据 I…...

IO和NIO的主要区别在哪里?

Java 中的 IO&#xff08;输入/输出&#xff09;和 NIO&#xff08;新输入/输出&#xff09;都是处理输入和输出操作的方式&#xff0c;它们的主要区别在于如何处理数据的读写。 阻塞与非阻塞: IO是阻塞的&#xff0c;这意味着当一个线程调用read()或write()时&#xff0c;该线…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

OCR MLLM Evaluation

为什么需要评测体系&#xff1f;——背景与矛盾 ​​ 能干的事&#xff1a;​​ 看清楚发票、身份证上的字&#xff08;准确率>90%&#xff09;&#xff0c;速度飞快&#xff08;眨眼间完成&#xff09;。​​干不了的事&#xff1a;​​ 碰到复杂表格&#xff08;合并单元…...

C++--string的模拟实现

一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现&#xff0c;其目的是加强对string的底层了解&#xff0c;以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量&#xff0c;…...