Use this file to discover all available pages before exploring further.
QLC+ uses a plugin architecture to support different DMX interfaces and protocols. Creating a plugin allows you to add support for new hardware devices or network protocols.
MyPlugin::MyPlugin() : QLCIOPlugin(){ // Initialize members}MyPlugin::~MyPlugin(){ // Clean up resources}
2
Initialization
void MyPlugin::init(){ // Discover available devices/interfaces // This is called once after the plugin is loaded}QString MyPlugin::name() const{ return QString("My Plugin");}int MyPlugin::capabilities() const{ return Output | Input | Infinite;}QString MyPlugin::pluginInfo() const{ QString info; info += QString("<HTML><BODY>"); info += QString("<H3>My Plugin</H3>"); info += QString("<P>Supports my custom hardware</P>"); info += QString("</BODY></HTML>"); return info;}
3
Output Management
QStringList MyPlugin::outputs() const{ QStringList list; // Return list of available output lines for (int i = 0; i < availableOutputCount(); i++) { list << QString("Output %1").arg(i + 1); } return list;}QString MyPlugin::outputInfo(quint32 output){ // Return human-readable description of this output return QString("My Device Output %1").arg(output + 1);}bool MyPlugin::openOutput(quint32 output, quint32 universe){ // Open the specified output line for the given universe if (output >= availableOutputCount()) return false; m_outputMap[output] = universe; // Initialize hardware/connection return initializeOutput(output);}void MyPlugin::closeOutput(quint32 output, quint32 universe){ Q_UNUSED(universe) // Close the output and release resources m_outputMap.remove(output); shutdownOutput(output);}void MyPlugin::writeUniverse(quint32 universe, quint32 output, const QByteArray& data, bool dataChanged){ Q_UNUSED(dataChanged) // Send DMX data to hardware if (!m_outputMap.contains(output)) return; if (m_outputMap[output] != universe) return; // Transmit 'data' (512 bytes of DMX) to the hardware transmitData(output, data);}
4
Input Management
QStringList MyPlugin::inputs() const{ QStringList list; // Return list of available input lines for (int i = 0; i < availableInputCount(); i++) { list << QString("Input %1").arg(i + 1); } return list;}QString MyPlugin::inputInfo(quint32 input){ return QString("My Device Input %1").arg(input + 1);}bool MyPlugin::openInput(quint32 input, quint32 universe){ if (input >= availableInputCount()) return false; m_inputMap[input] = universe; // Start listening for input return initializeInput(input);}void MyPlugin::closeInput(quint32 input, quint32 universe){ Q_UNUSED(universe) m_inputMap.remove(input); shutdownInput(input);}
5
Input Notification
// When input data is received, emit the signalvoid MyPlugin::handleInputData(quint32 input, const QByteArray& data){ if (!m_inputMap.contains(input)) return; quint32 universe = m_inputMap[input]; // Emit signal for each changed channel for (int channel = 0; channel < data.size(); channel++) { uchar value = data[channel]; emit valueChanged(universe, input, channel, value); }}
bool MyPlugin::canConfigure(){ return true; // Plugin has configuration UI}void MyPlugin::configure(){ // Show configuration dialog MyConfigDialog dialog; dialog.exec(); // Emit signal if configuration changed emit configurationChanged();}QString MyPlugin::setupWidgetClassName() const{ // Return name of configuration widget class // Used by QML UI return QString("MyPluginConfig");}