Connect cpp signal to qml registered cpp class
-
I have to two classes one is dataGenerator(generates data) and other is dataDisplay "exposed to QML using qmlRegisterType<dataDisplay>("dataDisplay", 1, 0, "dataDisplay") "
class dataGenerator{
signals:
void DataChunkGenerated(QVector<double> &dataChunk);
}
class dataDisplay
{
public slots:
void updateData(const QVector<double> &dataChunk);
}
how to connect signal DataChunkGenerated(QVector<double> &dataChunk); from dataGenerator to slot in dataDisplay.updateData(const QVector<double> &dataChunk) which takes QVector<double> &dataChunk as parameter -
There are two possible solutions for connect this signal and slot,
1.Change the signal definition to use const QVector<double> &, making it compatible with the slot.
connect(&dataGenerator, &DataGenerator::DataChunkGenerated,
&dataDisplay, &DataDisplay::updateData);2.If modifying the signal is not an option, use a lambda function to convert
connect(&dataGenerator, &DataGenerator::DataChunkGenerated,
&dataDisplay, [&](QVector<double> &dataChunk) {
dataDisplay.updateData(dataChunk);
}); -
- Modify dataGenerator Signal:
Qt does not allow non-const references (&) in signals for queued connections. Modify the signal to use a const reference:
class dataGenerator : public QObject {
Q_OBJECT
signals:
void DataChunkGenerated(const QVector<double> &dataChunk); // Use const reference
};
2. Ensure dataDisplay Slot Matches the Signature:
Your dataDisplay class already has:class dataDisplay : public QObject {
Q_OBJECT
public slots:
void updateData(const QVector<double> &dataChunk);
};
This matches the modified signal.- Connect the Signal to the Slot in C++:
You can establish the connection in main.cpp or wherever you create these objects:
dataGenerator *generator = new dataGenerator();
dataDisplay *display = new dataDisplay();// Connecting the signal from dataGenerator to the slot in dataDisplay
QObject::connect(generator, &dataGenerator::DataChunkGenerated,
display, &dataDisplay::updateData); - Modify dataGenerator Signal: