Есть сигнал у объекта класса MainWindow:

class MainWindow : public QMainWindow
{
Q_OBJECT

signals:
void selectPointsFile(QString &fileName);


Эмитится так:

// Отправка сигнала что выбран новый файл бинарных координат для точек
emit selectPointsFile(fileName);


Есть слот у объекта класса PointsLoader:
class PointsLoader : public QObject
{
Q_OBJECT

public slots:
void setPointsFile(QString &fileName);


Реализация слота:

void PointsLoader::setPointsFile(QString &fileName)
{
qDebug() << "Set new points file";
mFileName=fileName;
}


Они соеденены в «новом» синтаксисе. Объект MainWindow доступен по указателю, а PointsLoader в явном виде, поэтому у него адрес берется:

    // Главное окно оповещает считыватель точек, что задан новый файл координат
connect(mMainWindow, &MainWindow::selectPointsFile,
&mPointsLoader, &PointsLoader::setPointsFile);


Компиляция проходит без ошибок. Но когда выбираешь новый файл и эмитится сигнал selectPointsFile(fileName), выдается ошибка:

QObject::connect: Cannot queue arguments of type 'QString&' 
(Make sure 'QString&' is registered using qRegisterMetaType().)


Если переделать параметр с типа QString& на QString, то ошибка исчезает. Но мне нужно сделать именно по ссылке, так как дальше я буду делать похожий сигнал/слот, который будет передавать большой блок данных, и хотел бы его уметь передавать по ссылке.

Примечание: объект класса PointsLoader находится в отдельном потоке, возможно из-за это проблема? Но как ее можно обойти чтобы не гонять в явном виде данные, а только ссылку на них?








 , , , ,






URL записи