Проблема заключается в том, что при запуске приложения появляется сообщение о закрытии приложения без выяснения причины проблемы.
Приложение представляет собой простой калькулятор для сложения двух чисел.
Это приложение содержит шесть объектов графического интерфейса.
Два QSpinBox
ввести цифры.
Три Qlabel
, два Qlabel
для отображения +
, =
и еще один, чтобы вывести результат сложения двух чисел, and this object is the reason of the problem
,
Наконец, один QPushButton
чтобы отобразить результат в Qlabel
,
Теперь пришло время отобразить код:
У меня три файла (main.cpp
, calculator.h
, calculator.cpp
).
— Main.cpp —
#include "calculat.h"
int main(int argc, char *argv[]){
QApplication app(argc, argv);
Calculator calc;
calc.show();
return app.exec();
}
— calculator.h —
#ifndef CALCULATOR_H
#define CALCULATOR_H
#include <QWidget>
class QSpinBox;
class QLabel;
class Calculator : public QWidget {
Q_OBJECT
public:
Calculator();
private slots:
void on_addNumber_clicked();
public:
QSpinBox *firstValueSpinBox;
QSpinBox *secondValueSpinBox;
QLabel *resultLabel;
};
#endif // CALCULATOR_H
— calculator.cpp —
#include "calculator.h"#include <QPushButton>
#include <QSpinBox>
#include <QLabel>
#include <QHBoxLayout>
Calculator::Calculator(){
QPushButton *addButton = new QPushButton("Add");
firstValueSpinBox = new QSpinBox();
secondValueSpinBox = new QSpinBox();
resultLabel = new QLabel();
QLabel *addLabel = new QLabel("+");
QLabel *equalLabel = new QLabel("=");
connect(addButton, SIGNAL(clicked()), this, SLOT(on_addNumber_clicked()));
QHBoxLayout *layout = new QHBoxLayout(this);
layout->addWidget(firstValueSpinBox);
layout->addWidget(addLabel);
layout->addWidget(secondValueSpinBox);
layout->addWidget(addButton);
layout->addWidget(equalLabel);
layout->addWidget(resultLabel);
}
void Calculator::on_addNumber_clicked(){
int num = this->firstValueSpinBox->value();
int num2 = this->secondValueSpinBox->value();
QString outResult = QString::number(num + num2);
resultLabel->setText(outResult); //<< the problem here
}
Я сомневаюсь в этой строке:
resultLabel->setText(outResult);
При удалении этой предыдущей строки приложение работает нормально.
Вывод, проблема в этом Qlabel
объект, который отвечает за отображение окончательного результата.
QLabel *resultLabel; // declaration in calculator.h
resultLabel->setText(outResult); // in calculator.cpp
В вашем коде нет ошибок, приводящих к сбою. Работает просто отлично. Ваша проблема — довольно классический результат устаревших объектных файлов, которые больше не соответствуют коду. Код, сгенерированный из moc_calculator.cpp
устарел Как вы строите проект: вручную или с помощью make / qmake? Если вы используете make / qmake или make / cmake (скажем, из Qt Creator), сделайте следующее:
Полностью удалите каталог сборки (вы найдете его на один каталог выше исходного кода).
Перестроить.
Есть функциональная ошибка, которая не приводит к сбою, просто к неправильному поведению. Может быть, это даже опечатка. Вместо resultLabel->setText("outResult");
, ты хочешь
resultLabel->setText(outResult);
Других решений пока нет …