Reputation: 11
I have met a problem while using Qt. When I try to start the below program it exits with code: -1073741819 (0xC0000005)
#include <iostream>
#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QSlider>
#include <QPixmap>
#include <QPainter>
#include <QPaintEvent>
class ColorfulCircle : public QWidget
{
Q_OBJECT
public:
ColorfulCircle(QWidget *parent) {
setParent(parent);
mGreenCircle = QPixmap("GreenCircle.png");
mYellowCircle = QPixmap("YellowCircle.png");
mRedCircle = QPixmap("RedCircle.png");
if (mGreenCircle.isNull() || mYellowCircle.isNull() || mRedCircle.isNull()) {
std::cerr << "Failed to load circle images!" << std::endl;
return;
}
mCurrentCircle = mGreenCircle;
setFixedSize(100, 100);
}
QSize minimumSizeHint() const override {
return QSize(100, 100);
}
protected:
void paintEvent(QPaintEvent *e) override {
QPainter p(this);
p.drawPixmap(e->rect(), mCurrentCircle);
}
public slots:
void setGreen() {
mCurrentCircle = mGreenCircle;
update();
}
void setYellow() {
mCurrentCircle = mYellowCircle;
update();
}
void setRed() {
mCurrentCircle = mRedCircle;
update();
}
private:
QPixmap mCurrentCircle;
QPixmap mGreenCircle;
QPixmap mYellowCircle;
QPixmap mRedCircle;
};
int main(int argc, char **argv) {
QApplication app(argc, argv);
QWidget window;
window.setWindowTitle("Colorful Circle");
window.setFixedSize(200, 250);
QVBoxLayout *layout = new QVBoxLayout(&window);
ColorfulCircle circle(nullptr);
layout->addWidget(&circle, 0, Qt::AlignCenter);
QSlider slider(Qt::Horizontal);
slider.setRange(0, 100);
layout->addWidget(&slider);
QObject::connect(&slider, &QSlider::valueChanged, [&circle](int newValue) {
if (newValue < 33) {
circle.setGreen();
} else if (newValue < 66) {
circle.setYellow();
} else {
circle.setRed();
}
});
window.show();
return app.exec();
}
#include <main.moc>
I tried to do something, checked via debugger but I'm not so good at this. Some tries gave me another exit code: -1073740940 (0xC0000374). But I think that there is the same problem in both cases
Upvotes: 1
Views: 76
Reputation: 38863
layout->addWidget()
takes ownership of a pointed object. Passing addresses of auto/stack variables to there is an error: when the app exits, it comes to call delete &circle; delete &slider;
.
The correct code should be like this:
ColorfulCircle* circle = new ColorfulCircle(nullptr);
layout->addWidget(circle, 0, Qt::AlignCenter);
QSlider* slider = new QSlider(Qt::Horizontal);
slider->setRange(0, 100);
layout->addWidget(slider);
Upvotes: 4