QObject::connect()错误.应用程序崩溃.无构建错误

Error with QObject::connect(). Application Crashes. No build Error

本文关键字:错误 崩溃 构建 应用程序 connect QObject      更新时间:2023-10-16

我想做一个计算器应用程序做简单的计算。它在构建时不显示任何错误,但在运行时崩溃程序意外结束。desktop_qt_5_4_2_mingw_32bit2 - debug debugcalc.exe crash

calculator.h

#ifndef CALCULATOR
#define CALCULATOR
#include <QWidget>
class calculator : public QObject
{
    Q_OBJECT
public:
    calculator ( QWidget *parent=0);
    int value=0;
private slots:
    void setValue(int);
};
#endif // CALCULATOR

calculator.cpp

#include <QWidget>
#include <calculator.h>
#include <QPushButton>
#include <QLineEdit>
#include <QGridLayout>
calculator::calculator(QWidget *parent)
{
    QWidget *window = new QWidget;
    QPushButton *add = new QPushButton;
    add->setText("+");
    QPushButton *sub = new QPushButton;
    sub->setText("-");
    QPushButton *mul = new QPushButton;
    mul->setText("*");
    QPushButton *div = new QPushButton;
    div->setText("/");
    QPushButton *enter = new QPushButton;
    enter->setText("enter");
    QLineEdit *disp = new QLineEdit(parent);
    QGridLayout *layout = new QGridLayout;
    layout->addWidget(disp,0,0,0);
    layout->addWidget(add,1,0,0);
    layout->addWidget(sub,1,1,0);
    layout->addWidget(mul,1,2,0);
    layout->addWidget(div,1,3,0);
    layout->addWidget(enter,2,0,0);
    window->setLayout(layout);
    window->show();
    calculator field1, field2, result;
    connect(add,SIGNAL(clicked()),&field1,SLOT((calculator::setValue(disp->text().toInt()))));
    disp->clear();
    connect(enter,SIGNAL(clicked()),&field2,SLOT(calculator::setValue(disp->text().toInt())));
    result.value=field1.value+field2.value;
    disp->setText(QString::number(result.value));
 }
 void calculator::setValue(int val)
 {
    value=val;
 }

main.cpp

#include <QApplication>
#include <calculator.h>
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    calculator cal;
    return app.exec();
}

您将信号连接到堆栈上对象的插槽:

calculator field1, field2, result;
connect(add,SIGNAL(clicked()),&field1,SLOT((calculator::setValue(disp->text().toInt()))));

所以当这个槽被调用时对象已经销毁了。而不是创建新的计算器对象,你应该连接到这个插槽:

connect(add,SIGNAL(clicked()),this,SLOT(setValue()));

请注意,对于无参数的信号,您需要有无参数的插槽。所以对于你想处理的每个小部件,如果它们有不同的行为,你需要创建不同的插槽。