Ошибка 'нет такого слота' qt

Я пытаюсь подключить два виджета с помощью опции сигналов / слотов, но все еще получаю сообщение об ошибке, что «такого слота нет». Дело в том, что при написании программы я использовал Ctrl + Пробел, чтобы не допустить опечаток.

так что у меня есть один виджет:

renderArea.h


    class renderArea : public QGraphicsView
    {
        Q_OBJECT
    public:
        renderArea(QWidget *parent = 0);

    void addClothoid(float length, float startCurvature, float endCurvature);

    signals:
        void sendData(float length, float startCurvature, float endCurvature);

    };

renderArea.cpp


    void renderArea::addClothoid(float length, float startCurvature, float endCurvature)
    {
        ...

            emit sendData(length, startCurvature, endCurvature);
        }
    }

второй виджет:

tableViewList.h


    class TableViewList: public QTableView
    {
        Q_OBJECT

    public:
        TableViewList(QWidget* parent = 0);

    protected slots:
        void onClothoidAdded(float length, float startCurvature, float endCurvature);
    };

tableViewList.cpp


    void TableViewList::onClothoidAdded(float length, float startCurvature, float endCurvature)
    {

    ...
    }

и основной виджет:

renderwidget.cpp, где я подключаю 2 выше:


    renderingWidget::renderingWidget(QWidget *parent) :
            QWidget(parent),
            ui(new Ui::renderingWidget)
    {
        ui->setupUi(this);

    connect(ui->graphicsView, SIGNAL(sendData(float,float,float)), ui->clothoidTable,
                SLOT(onClothoidAdded(float,float,float)));
    }

ui-> graphicsView был повышен до renderArea, а ui-> clothoidTable - до TableViewList.

Так почему же могла появиться эта ошибка?


person schmimona    schedule 05.08.2011    source источник


Ответы (2)


Вы повторно сгенерировали файлы проекта после добавления сигнала / слотов в класс? В зависимости от вашей системы сборки это необходимо для работы.

Qt необходимо предварительно обработать заголовки классов (он не сканирует файлы cpp), чтобы сгенерировать дополнительный код, реализующий поведение сигнала / слота (для сигналов / слотов он использует компилятор MOC). Если Qt не знает, что класс X содержит сигнал или слот, он просто не будет генерировать метаинформацию для этого класса.

При повторной генерации файлов проекта / Make file Qt снова просканирует все файлы и сгенерирует необходимые команды для компилятора MOC.

person KPK    schedule 05.08.2011
comment
Вы проверили сгенерированные файлы с помощью moc, чтобы узнать, создается ли слот? Возможно, удаление всех этих временных файлов тоже помогает (я помню, что время от времени возникали проблемы с кешированием) - person KPK; 05.08.2011
comment
Я проверил все make-файлы, и ни в одном из них нет упоминания о моем слоте. - person schmimona; 05.08.2011
comment
В файлах make вы должны искать заголовки классов, которые будут отображаться для обработки MOC. MOC создает свой вывод во временную папку, на самом деле он создает такие файлы, как moc_ ‹ваше имя класса› .h и moc_ ‹ваше имя класса› .cpp. Загляните в эти файлы, чтобы увидеть, появляются ли ваши слоты - person KPK; 05.08.2011

Ваш слот защищен и поэтому не виден renderingWidget. Вам нужно будет сделать его общедоступным, если вы хотите установить соединение с ним извне TableViewList.

person Arnold Spence    schedule 05.08.2011