C++ Qt信号多重定义

C++ Qt信号多重定义,c++,qt,qml,C++,Qt,Qml,我不明白,我有一个标题: #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 WRIT

我不明白,我有一个标题:

#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;
};
#pragma一次
#包括
#包括
#包括
#包括
#包括
类主窗口:公共QObject
{
Q_对象
Q_属性(QString用户名读取用户名写入设置用户名通知用户名更改)
公众:
显式主窗口(QObject*parent=nullptr);
QString用户名();
void setUserName(常量QString和userName);
公众时段:
信号:
void userNameChanged();
私人:
QString m_用户名;
};
和加拿大人民党:

#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;
}
#包括“MyWindow.h”
MainWindow::MainWindow(QObject*父对象):QObject(父对象)
{
}
QString主窗口::用户名(){
返回m_用户名;
}
void主窗口::setUserName(常量QString和userName){

std::cout不要定义自己的信号函数,因为MOC是为你做的。

不要定义自己的信号函数,因为MOC是为你做的。

userNameChanged
是一个
信号
不是一个
插槽
。你可以
在任何你想要的地方发出这个信号,并且不需要实现它。请参见ms提示您希望在
setUserName
函数中设置用户名后发出此信号。因此,请按如下操作:

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

}
void主窗口::setUserName(const QString&userName){

std::cout
用户名更改
是一个
信号
而不是
插槽
。您可以
在任何地方发出该信号,无需执行该信号。似乎您希望在
设置用户名
函数中设置用户名后发出该信号。因此,请按如下操作:

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

}
void主窗口::setUserName(const QString&userName){

std::不能在cpp中自己定义信号,moc会为您定义信号。(对于您的版本,不会调用插槽)您不能自己实现信号。@Frankosterfield这要感谢Q_属性宏(我是qt/qml初学者)?如果我想让我的信号有一个特定的行为,我能做什么?@chehrlic t感谢Q_属性宏(我是qt/qml初学者)?如果我想让我的信号有一个特定的行为,我能做什么?信号只是通知机制的发送端,带有可选的附加数据。这就是它们可以有的所有行为。你能用更多关于你需要什么特殊行为以及何时(例如,在发送信号之前)的细节更新问题吗。不要自己在cpp中定义信号,moc会为您定义。(对于您的版本,不会调用插槽)您不能自己实现信号。@Frankosterfield这要感谢Q_属性宏(我是qt/qml初学者)?如果我想让我的信号有一个特定的行为,我能做什么?@chehrlic t感谢Q_属性宏(我是qt/qml初学者)?如果我想让我的信号有一个特定的行为,我能做什么?信号只是通知机制的发送端,带有可选的附加数据。这就是它们可以有的所有行为。你能用更多关于你需要什么特殊行为以及何时(例如,在发送信号之前)的细节更新问题吗。非常确定应该是
emit userNameChanged();
非常确定应该是
emit userNameChanged();