2016-05-12 2 views
1

Есть ли ограничение на количество параметров сигналов?Нет соответствующего вызова для соединения - когда я устанавливаю 7 параметров. отлично работает с 6 параметрами

/home/.../testerslow/jjjj.h:36: error: no matching function for call to 'Controller::connect(Controller* const, void (Controller::*)(int, int, int, int, int, int, int), Worker*&, void (Worker::*)(int, int, int, int, int, int, int))' 
     connect (this, &Controller::operate, worker, &Worker::doWork); 

В следующем коде просто уменьшите 1 параметр до уровня сигнала и работайте, и ошибка исчезнет.

Каков путь прохождения 7-го аргумента?

воспроизводимый пример:

#ifndef JJJJ 
#define JJJJ 
#include <QQuickItem> 
#include <QDebug> 
#include <QThread> 


class Worker : public QObject 
{ 
    Q_OBJECT 

public: 
    Worker() { } 

public slots: 
    void doWork (int one, int b, int c, int d, int e, int f, int h) 
    { 
     emit resultReady(""); 
    } 

signals: 
    void resultReady(const QString &result); 
}; 

class Controller : public QObject 
{ 
    Q_OBJECT 

    QThread workerThread; 

public: 
    Controller() { 
     Worker *worker = new Worker; 

     connect (&workerThread, &QThread::finished, worker, &QObject::deleteLater); 
     connect (this, &Controller::operate, worker, &Worker::doWork); 
     connect (worker, &Worker::resultReady, this, &Controller::handleResults); 
     worker->moveToThread(&workerThread); 

     workerThread.start(); 
    } 

    ~Controller() { 
     workerThread.quit(); 
     workerThread.wait(); 
    } 

public slots: 
    void handleResults(const QString &) {} 

signals: 
    void operate(int, int, int,int,int,int, int); 
}; 
#endif // JJJJ 
+6

Из [документация] (http://doc.qt.io/qt-5/signalsandslots.html#signals-and-slots-with-default-arguments): «Обратите внимание, что если ваш компилятор не поддерживает C++ 11 variadic templates, этот синтаксис работает только в том случае, если сигнал и слот имеют 6 аргументов или меньше». Вместо этого вы можете использовать макросы SIGNAL и SLOT, которые внутренне создают строки. –

+0

Поместите эти переменные в структуру или класс и передайте это вместо этого. – thuga

+0

@ KarstenKoop очень благодарен. –

ответ

4

Согласно documentation, вы ограничены вызовам с шестью аргументов или менее с использованием синтаксиса нового стиля, если ваш компилятор не поддерживает VARIADIC подписи шаблона. Быстрое решение - создать тип контейнера и зарегистрировать его с помощью QMetaType с использованием Q_DECLARE_METATYPE и qRegisterMetaType.

Во-первых, объявить тип данных:

//foo.h 
#include <QMetaType> 

struct Foo 
{ 
    int one, b, c, d, e, f, h; 
} 
Q_DECLARE_METATYPE(Foo) 

Поскольку вы с использованием потоков, что означает, поставленные в очередь сигналы, необходимо также регистрировать метатип во время выполнения с qRegisterMetaType, как правило, в main или некоторой функции инициализации, которая вызывается только один раз:

//main.cpp 
#include <QApplication> 
#include <QMetaType> 
#include "foo.h" 

int main(...) 
{ 
    QApplication app(argc, argv); 
    qRegisterMetaType<Foo>(); 
    ... //do more things here 
    return app.exec() 
} 

Теперь вы должны быть в состоянии использовать Foo в сигнальных соединений и слот без проблем, используя следующие для сигналов и слотов подписей:

void doWork(Foo foo); 

и

void operate(Foo); 
+0

P.S. Престижность при правильном использовании QThread вместо подкласса. Я не думаю, что анти-шаблон никогда не исчезнет. –

 Смежные вопросы

  • Нет связанных вопросов^_^