Qt signal множественные определения - PullRequest
0 голосов
/ 20 июня 2020

Не понимаю, у меня есть заголовок:

#pragma once

#include <QObject>
#include <QString>
#include <QtQml>
#include <qqml.h>
#include <iostream>

class MainWindow : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString userName READ userName WRITE setUserName NOTIFY userNameChanged)

public:
    explicit MainWindow(QObject *parent = nullptr);

    QString userName();

    void setUserName(const QString &userName);

public slots:

signals:
    void userNameChanged();

private:
    QString m_userName;
};

И cpp:

#include "MyWindow.h"

MainWindow::MainWindow(QObject *parent) : QObject(parent)
{

}

QString MainWindow::userName()  {
    return m_userName;
}

void MainWindow::setUserName(const QString &userName) {
    std::cout << "SET USERNAME" << std::endl;
    m_userName = userName;
}

void MainWindow::userNameChanged() {
    std::cout << "UPDATED" << std::endl;
}

При компиляции выдает ошибку:

/ путь / к / файлу / build / moc_MyWindow. cpp: 169: ошибка: множественное определение `MainWindow :: userNameChanged () '; MyWindow.o: / path / to / file / build /../ project / Views / MyWindow. cpp: 17: сначала определено здесь

Я не понимаю, в чем проблема.

Спасибо

Ответы [ 2 ]

1 голос
/ 20 июня 2020

userNameChanged - это signal, а не slot. Вы можете emit этот сигнал где угодно, и нет необходимости его реализовывать. Похоже, вы хотите послать этот сигнал, как только имя пользователя будет установлено в функции setUserName. Итак, сделайте это следующим образом:

void MainWindow::setUserName(const QString &userName) {
    std::cout << "SET USERNAME" << std::endl;
    m_userName = userName;
    emit userNameChanged;

}

и удалите реализацию MainWindow::userNameChanged().

1 голос
/ 20 июня 2020

Не определяйте себе функцию сигнала, потому что MO C сделает это за вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...