Content is user-generated and unverified.

From Simula to Qt: The 55-Year Journey of a Meta-Object Design

A short history of how a park-bench idea in Trondheim became the scripting-ready object surface powering modern cross-platform applications.


1967 - Oslo: Classes Are Invented

Ole-Johan Dahl and Kristen Nygaard finalise Simula 67 at the Norwegian Computing Center in Oslo. Simula introduces classes, objects, inheritance, virtual methods, and dynamic dispatch - the entire vocabulary of what would later be called object-oriented programming. Simula was built to model real-world simulations, so its objects were first-class runtime entities that could be inspected, enumerated, and manipulated at runtime, not just compile-time abstractions.

This distinction matters. Simula's objects carried their own identity and structure at runtime - the seed of every meta-object system that followed.

1979-1985 - Bell Labs: C++ Industrialises Classes

Bjarne Stroustrup begins "C with Classes" at Bell Labs in 1979, explicitly citing Simula as his inspiration for the class model. The language is renamed C++ in 1983. The first edition of The C++ Programming Language ships in 1985, making classes, constructors, destructors, operator overloading, and single inheritance production-ready on commercial compilers.

By 1989, C++ 2.0 adds multiple inheritance, abstract classes, and protected members. The 1990 Annotated Reference Manual (ARM) serves as the de facto standard until ISO C++98.

What C++ did not inherit from Simula was runtime introspection. C++ classes compile down to efficient structures and vtables with no standard runtime metadata. If you wanted to ask "what properties does this object have?" at runtime, you had to build that machinery yourself.

1990 - Trondheim: The Park Bench

Haavard Nord and Eirik Chambe-Eng, working on a C++ cross-platform database application for ultrasound imaging that had to run on classic Mac OS, Unix, and Microsoft Windows, experience the full pain of 1990-era GUI development. Every platform had its own toolkit, its own event model, its own callback mechanism.

Sitting on a park bench in Trondheim, they sketch the core ideas of what would become Qt, including the signal-slot mechanism for loosely-coupled event handling.

Coding begins in 1991.

1994-1995 - Trolltech and First Release

Trolltech is incorporated on 4 March 1994. Qt 0.90 ships publicly on 20 May 1995 for X11/Linux, under a dual commercial / FreeQt licence.

The core design decision that defines Qt for the next three decades is already in place: a Meta-Object Compiler (moc) that parses class declarations and generates C++ code carrying runtime metadata about signals, slots, properties, and class identity.

Why moc Instead of Templates?

In 1991-1995, C++ templates were described in the ARM but compiler support was inconsistent and buggy across the Unix / Mac / Windows landscape Qt had to ship on. Templates could not be relied upon to produce portable code. Nord and Chambe-Eng chose a code-generator preprocessor that emitted plain, portable C++.

The Qt team have written publicly about the trade-off: "Syntax isn't just sugar: the syntax we use to express our algorithms can significantly affect the readability and maintainability of our code. The syntax used for Qt's signals and slots has proved very successful in practice. The syntax is intuitive, simple to use and easy to read."

Once the preprocessor existed for signals and slots, everything else piled on top of it for free:

  • Dynamic property system with runtime introspection
  • Scoped translations via generated tr() functions
  • qobject_cast<T>() that worked portably without relying on compiler RTTI
  • Extended runtime type information for plugin systems and dynamic loading
  • Automatic binding surface for scripting languages

1996-2008 - Growth and Adoption

  • 1996 European Space Agency becomes Trolltech's first customer. Qt 1.0 ships with full X11 support, free for free software.
  • 1998 KDE chooses Qt as its foundation, making Qt the default toolkit for one of the two major Linux desktop environments.
  • 2002 Qtopia launches, bringing Qt to embedded Linux devices.
  • 2005 Qt 4.0 - major architectural rewrite, container classes redesigned, new graphics stack.
  • 2006 Trolltech IPOs on the Oslo Stock Exchange.
  • 2008 Nokia acquires Trolltech for approximately 104 million euros to power its mobile platform strategy.

Throughout this period, the meta-object system quietly underpins every new capability added to the framework. Qt Designer, the WYSIWYG UI builder, only works because every widget's properties are discoverable at runtime through the meta-object. Qt's scripting bindings (Python via PyQt and later PySide, plus official QtScript) all work by enumerating QMetaObject entries.

2010-2020 - QML, Qt Quick, and Declarative UI

  • 2010 Qt Quick and the declarative QML language arrive. QML is directly powered by the meta-object system - QML's property bindings are literally Qt properties exposed to a JavaScript-like declarative syntax.
  • 2012 Nokia divests Qt; Digia acquires commercial rights.
  • 2014 Qt 5.3 - mature cross-platform story covering desktop, mobile, and embedded.
  • 2020 Qt 6.0 officially released on 8 December 2020. The framework modernises to C++17, adopts CMake as its build system, introduces the Rendering Hardware Interface (RHI) for a unified graphics backend, and brings QML's property binding model back into C++ via the new QProperty system.

2023-2025 - Qt 6 LTS Era

  • April 2023 Qt 6.5 LTS released.
  • 2024 Qt 6.7 and 6.8 land, with new modules like QtGraphs for 2D/3D data visualisation and expanded tooling for Android Studio, Visual Studio Code, and MCUs.
  • October 2025 Qt 6.10 released.

Qt today spans automotive dashboards, industrial automation, consumer electronics, medical devices, and desktop applications across Windows, macOS, Linux, iOS, Android, embedded Linux, real-time operating systems, and microcontrollers. Every one of those platforms is reached through the same QObject meta-object surface that was sketched on a park bench in 1990.

The Norwegian Through-Line

  • 1967 Oslo - Dahl and Nygaard invent classes in Simula
  • 1979 Bell Labs - Stroustrup industrialises them as C++
  • 1990 Trondheim - Nord and Chambe-Eng build Qt's meta-object layer on top
  • 2025 global - tens of millions of applications ship on that foundation

Reasonable national claim to the entire object-oriented GUI stack.


Why This Design Matters for Modern Binding Kernels

Qt's meta-object system was architected from day one so that any outside caller can discover and drive any QObject using just three generic operations - read a property, write a property, invoke a method or slot - plus one event primitive: connect a signal to a callback. That is the entire surface area. Everything a GUI can do - create a window, set its title, show a button, react to a click, load an HTML document, resize a layout - is expressible through those operations acting on named widget instances.

This is the quiet gift Trolltech built in 1991 and that has been polished for thirty-five years.

Universal Binding Micro-Kernel Engine APIs

A Universal Binding Software Multi-Platform Micro-Kernel is system software whose entire object contract is a single uniform primitive: everything is a bindable. Values, operators, built-ins, data structures, services, and GUI widgets are all the same kind of thing - addressable by name, accessed through select-member, activated through invoke, read through get, assigned through set. The kernel does not distinguish "language objects" from "framework objects" from "device objects". There is one object model, and every participant in the system conforms to it.

When a framework like Qt exposes a meta-object surface whose contract matches the kernel's binding contract - the result of early design decisions on both sides converging on the same paradigm - the two systems compose without translation. Qt does not become a thing the kernel drives. Qt becomes a first-class client citizen of the kernel itself. Every QObject is a native bindable. Every Q_PROPERTY is a native member. Every slot is a native invoke target. Every signal is a native event source. There is no foreign API, no translation boundary, no adapter worldview to maintain - only a transport carrying identical operations across a module boundary.

The Consequence

This changes what becomes possible:

  • Zero-cost widget onboarding. Adding a new Qt widget class to the kernel's object space is a one-line registration. Every property, method, and signal is already addressable through the kernel's uniform contract.
  • Cross-platform uniformity. Because the kernel is platform-agnostic at its core, the same binding surface drives Qt on Linux, Windows, macOS, embedded RTOS, and microcontrollers - wherever Qt runs, the kernel runs alongside it as a peer.
  • Multi-framework composition. Qt is not the only framework the kernel can host as a first-class client. Any meta-object, component, or service layer that exposes the same name-addressable property/method/event contract qualifies. The kernel federates them into one uniform object space.
  • Longevity by design. A widget class written in 1996 is addressable by a binding kernel designed in 2026 not because either side adapted to the other, but because both were built on the same underlying object geometry - the one Simula hinted at in 1967.

This is the architectural pay-off of thirty-five years of patient Norwegian refinement meeting a new class of kernel-level binding software. Qt did not have to change. The kernel did not have to wrap Qt. Two independently designed systems, separated by three decades, meet on a shared contract and compose natively.

The park bench paid off - and the same uniform object geometry that made Qt hospitable to tools that had not been invented yet is exactly what lets a Universal Binding Micro-Kernel host Qt as a native first-class citizen today.

The park bench paid off.


Compiled from public sources including Qt Wiki, The Qt Company documentation, Wikipedia, and first-hand accounts by Haavard Nord.

© Copyright 2026 Quantum Dynamics Ltd. All rights reserved.

This document may be reproduced and distributed for educational and non-commercial purposes provided this copyright notice remains intact. All trademarks referenced are the property of their respective owners. Qt is a trademark of The Qt Company Ltd. Simula, C++, and other named technologies are referenced under fair use for historical and educational commentary.

The views and technical commentary expressed herein are those of Quantum Dynamics Ltd and do not represent endorsement by, or affiliation with, The Qt Company, The Qt Project, or any other organisation named in this document.

Content is user-generated and unverified.
    Qt Meta-Object History: From Simula to Modern GUI Framework | Claude