A Show is the most advanced function type in QLC+. It provides a timeline-based approach where multiple functions can be placed on separate tracks with precise start times and durations. Shows are perfect for pre-programmed performances, theatrical productions, and synchronized displays.
Shows replace the need for complex chaser hierarchies by providing a visual timeline where you can see and control when each function plays.
Show├── Track 1: Stage Wash│ ├── Function at 0ms (5000ms duration)│ ├── Function at 6000ms (3000ms duration)│ └── Function at 10000ms (2000ms duration)├── Track 2: Moving Heads│ ├── Function at 2000ms (8000ms duration)│ └── Function at 11000ms (4000ms duration)└── Track 3: Effects └── Function at 5000ms (10000ms duration)
// Set time division mode and BPMvoid setTimeDivision(TimeDivision type, int BPM);// Get time division settingsTimeDivision timeDivisionType();int timeDivisionBPM();int beatsDivision(); // Returns 2, 3, or 4// Convert between string and enumstatic QString tempoToString(TimeDivision type);static TimeDivision stringToTempo(QString tempo);
// Add a trackbool addTrack(Track *track, quint32 id = Track::invalidId());// Remove a trackbool removeTrack(quint32 id);// Get track by IDTrack *track(quint32 id) const;// Get all tracksQList<Track*> tracks() const;// Get track countint getTracksCount();// Reorder tracksvoid moveTrack(Track *track, int direction);
// Get unique ShowFunction ID for creationquint32 getLatestShowFunctionId();// Get ShowFunction by IDShowFunction *showFunction(quint32 id);// Get track containing a ShowFunctionTrack *getTrackFromShowFunctionID(quint32 id);// Get track bound to a sceneTrack *getTrackFromSceneID(quint32 id);
class Track {public: quint32 m_id; // Track ID QString m_name; // Track name quint32 m_sceneID; // Optional bound scene QList<ShowFunction*> m_showFunctions; // Functions on track};
class ShowFunction {public: quint32 m_id; // Unique ShowFunction ID quint32 m_functionID; // Actual function to play quint32 m_startTime; // Start time (ms or beats) quint32 m_duration; // Duration override QColor m_color; // Display color in UI bool m_locked; // Prevent editing};
int adjustAttribute(qreal fraction, int attributeId) { // Each track has its own attribute index QList<Track*> trackList = m_tracks.values(); if (attributeId < trackList.count()) { Track *track = trackList.at(attributeId); m_runner->adjustIntensity(fraction, track); } return attributeId;}
Unlike other functions, Show attributes map to tracks, not generic properties. Attribute 0 controls track 0’s intensity, attribute 1 controls track 1, etc.
class ShowRunner {public: // Start functions at the right time void write(MasterTimer *timer); // Adjust track intensity void adjustIntensity(qreal fraction, Track *track); // Pause control void setPause(bool enable);};
Shows with hundreds of overlapping functions may cause CPU spikes when many functions start simultaneously. Consider staggering start times by a few milliseconds.