Library / SDK
paceholder/nodeeditor avatar
paceholder/nodeeditor

QtNodes separates the graph from the scene, so the same model runs headless

Qt Node Editor. Dataflow programming framework

3,722 stars962 forksC++BSD-3-Clause

At a glance

What is it?
paceholder/nodeeditor is a Qt library for building node editors, and its central architectural claim is that the graph does not need a view. The whole graph lives in a model class you can populate without ever attaching a graphics scene, and the dataflow layer is an optional subclass built on top of that same model. Everything else in the repository follows from that split.
Who is it for?
QtNodes suits someone building a node-based tool in C++ with Qt who needs the graph logic testable without a window. It does not suit someone who wants a scripting language in the graph, since the help section lists Python bindings and a markup-language frontend as still wanted rather than shipped.
Can I use it commercially?
Yes. BSD-3-Clause is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 106 days ago.
What is it written in?
Mainly C++, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.

From daily snapshots

Star history

  • paceholder/nodeeditor3,722 ★ · +22
Star history
Repository2026-09-242026-11-14
paceholder/nodeeditor3.7k3.7k

22 Stars in the last 51 days, measured from the daily GitHub snapshot. Compare with other projects

Editorial analysis

The graph is a model, and the view is optional

The introduction states the architecture before it states the features. The library uses a model-view approach, the whole graph structure is defined by a class you derive from an abstract base, and nodes and connections are created and added to it. The underlying data structures can be of any arbitrary type or representation, which is the sentence that makes the library general purpose: the graph does not have to contain a particular kind of payload. The sentence that follows is the one worth remembering, because it names the operating mode the rest of the design serves. An instance of that model could be attached to specialised graphics scene and view objects, or it could not be, and in the second case the library is said to work headless.

bash
mkdir build && cd build && cmake .. -DUSE_QT6=on

Dataflow is a subclass, not a mode

The dataflow section describes an extended model class that lets you register processing algorithms represented by nodes, and equips it with a set of the framework's signals and slots for propagating data through them. The propagation rules are stated plainly. A node's algorithm is triggered when any new input data arrives, the result is propagated to its output connections, each new connection fetches the available data and passes it on, and any change at the source node is propagated through every connection, updating the whole graph. That last property is the one that has consequences: the graph is reactive rather than polled, so a listener that changes a source node will wake everything downstream, and a cycle is not something the description says it prevents.

A warning sits directly under the documentation link

There is a warning paragraph immediately after the link to the hosted documentation, and it is about the second version rather than about anything transient. Many classes changed in the third version, and the instruction to anyone with a large project on the second series is to read the documentation first and look at the examples before checking out the new code. That ordering of advice tells you something: the upgrade is not a version bump but a redesign, and the examples are treated as part of the specification. Below it, the branch layout is spelled out, with a branch per major series and a development branch that holds the latest state, which is the conventional arrangement but is stated explicitly enough that you will know which one a clone gave you.

One build option decides your Qt major version

The build section is short because the interesting part is a single option. Setting it to false builds against the fifth major version of the framework, and the two commands shown differ only in that value, with everything else identical: create a build directory, enter it, and run the configuration step. A second option controls whether a static library is produced instead of a shared one. The dependency list above it is equally short: the framework itself above a specific version, a minimum CMake version, and a unit test library. That last one is not optional in practice, which is why the note further down tells you how to turn the tests off if you do not have it installed, rather than expecting the build to work without it.

bash
cmake .. -DBUILD_SHARED_LIBS=off

Testing is a compiled binary with named categories

The testing section treats unit tests as a feature rather than as scaffolding. It describes a suite built with one framework, then gives you three commands: build the test target, run the binary, and run a subset by passing a tag. Two tags are named, one for core functionality and one for the graphics system, which tells you the suite is organised by layer rather than by file. The coverage list underneath is the more useful half, because it maps tests to the library's promises: creating, modifying and removing nodes and connections, verifying that the model emits the signals it should, saving and loading a scene from its text format, the undo system, scene management, and connection utilities.

Twelve examples, each isolating one claim

The examples directory is the clearest statement of scope, because the names read as a feature list of one-item programs. There is a calculator, which is the only one that computes anything. The rest isolate a single capability: connection colours, a custom painter, dynamic ports, locking nodes and connections, node validation, resizable images, a simple graph model, styles, text handling, and two layouts, one vertical and one horizontal. A graph-model example sitting beside a custom-painter example is a good summary of the library's shape: the model is separable enough to demonstrate on its own, and the drawing is a consumer of it rather than part of it.

Each example also has its own build file listed at the top of the directory, which means adding one is a build-system change as well as a source change. For a library whose headline feature is that you can extend it, that is a reasonable amount of ceremony, and it is the reason the examples directory carries a configuration file rather than being picked up automatically.

Three things the project still wants

The help-needed section is a numbered list of three and it is the most honest paragraph in the readme. The first is Python wrapping through the framework's own Python bindings. The second is a frontend written in a markup language, which would let a graph be described declaratively rather than in C++. The third is a formatting configuration for the C++ formatter, which tells you the existing formatting is not enforced by a checked-in style file. The contribution section continues in the same register, asking for a proposal task before a pull request and explaining the maintainer's own constraint, that the work happens in free time, with a request to be pinged if a reply takes too long.

bash
git clone [email protected]:paceholder/nodeeditor.git

Editorial conclusion

QtNodes suits someone building a node-based tool in C++ with Qt who needs the graph logic testable without a window. It does not suit someone who wants a scripting language in the graph, since the help section lists Python bindings and a markup-language frontend as still wanted rather than shipped. Before upgrading from the second major version, read the warning, because the readme says many classes changed and the two versions live on separate branches.

Frequently asked questions

what is node editor

In this repository it is a graph of nodes and connections edited through a graphics scene, built as a general-purpose Qt library rather than a finished application. The whole graph lives in a model class you derive from, and the dataflow behaviour where a change at a source node propagates through every connection is an optional subclass of that model.

Is the node editing app free?

It is not an application but a library, released under a three-clause BSD licence. The readme also carries a donation request, and says that a donation above a stated amount will be forwarded to a fund supporting sick children with a report back to the donor.

Where can I find the node editor?

The documentation is hosted separately, and the examples in the repository are the fastest way to see the library used. Twelve example programs are listed, one per capability, from a calculator through connection colours, dynamic ports, node validation, custom painting, styles and two layout directions.

how to use node editor

You derive from the abstract graph model, add your own node and connection types, and optionally attach the model to a graphics scene and view. Dataflow propagation comes from a subclass that registers algorithms as nodes and uses signals to pass results along the connections, with each change at a source node updating the whole graph.

Official sources

  1. Issues
  2. License: BSD-3-Clause
  3. paceholder/nodeeditor on GitHub
  4. README
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/paceholder-nodeeditor.svg)](https://hysenlabs.com/projects/paceholder-nodeeditor)

Star history chart for your README

markdown
[![Star history](https://hysenlabs.com/chart/paceholder-nodeeditor.svg)](https://hysenlabs.com/projects/paceholder-nodeeditor)

Was this useful?