添加按钮时出错,即使存在,也不存在这样的插槽

Error when adding buttons, No such slot exists even though it is there

这是我遇到的完整错误,我的构建文件夹中确实有 moc 文件 我正在尝试调试并且显示了这条消息

Debugging starts
    QObject::connect: No such slot MainWindow::numberClicked(QString buttonInput) in ..\calculator\mainwindow.cpp:14
    QObject::connect:  (sender name:   'pushButtonNr0')
    QObject::connect:  (receiver name: 'MainWindow')

这是我的头文件,我确实有 Q_Object 宏,就像其他人建议的那样

    class MainWindow : public QMainWindow {
        Q_OBJECT

    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();

    private slots:

        void numberClicked(QString buttonInput);

这是我的cpp

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    _ui(new Ui::MainWindow) {
    _ui->setupUi(this);

    _inputSwitchDen = true;

    connect(_ui->pushButtonNr0, SIGNAL(clicked()), this, SLOT(numberClicked(QString buttonInput)));

这是函数

void MainWindow::numberClicked(QString buttonInput = "") {
    QPushButton *clickedButton = qobject_cast<QPushButton *> (sender());
    if (buttonInput == "") {
    buttonInput = clickedButton->text();
    }


    _ui->labelMessage->setText("");


    if (_inputSwitchDen) {
    if (_ui->lineDen->text() == "1")
        _ui->lineDen->setText(buttonInput);
    else {
        _ui->lineDen->setText(_ui->lineDen->text() + buttonInput);
    }
    } else {
    if (_ui->lineNum->text() == "0") {
        _ui->lineNum->setText(buttonInput);

    } else {
        _ui->lineNum->setText(_ui->lineNum->text() + buttonInput);
    }
    }

感谢阅读

connect(_ui->pushButtonNr0, SIGNAL(clicked()), this, SLOT(numberClicked(QString buttonInput)));

应该是

connect(_ui->pushButtonNr0, SIGNAL(clicked()), this, SLOT(numberClicked()));

connect(_ui->pushButtonNr0, SIGNAL(clicked()), this, SLOT(numberClicked(QString buttonInput)));

没有"QString buttonInput"因为点击信号不能传递参数。

如果你不想改变你的功能,你可以重载它。

void numberClicked() {
    numberClicked("");
}

void numberClicked(QString buttonInput) {
}

你应该利用 new signal/slot syntax

如果你真的不能改变MainWindow::numberClicked的声明(尽管重载它是显而易见的解决方案)那么你可以只使用lambda(未经测试)...

connect(_ui->pushButtonNr0, &QPushButton::clicked, this,
        [this]()
        {
          numberClicked();
        });

另请注意,在使用新语法时,无需显式声明槽——它们只是普通函数。