添加按钮时出错,即使存在,也不存在这样的插槽
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();
});
另请注意,在使用新语法时,无需显式声明槽——它们只是普通函数。
这是我遇到的完整错误,我的构建文件夹中确实有 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();
});
另请注意,在使用新语法时,无需显式声明槽——它们只是普通函数。