пример qwt Программа неожиданно завершилась

что-то не так с моим кодом, когда я запускаю свою программу (пример QWT), я получаю эту ошибку (программа неожиданно завершилась). Почему я получаю это сообщение об ошибке и как его исправить?

Спасибо

вот мой код:

    main.cpp
        #include "mainwindow.h"
        #include <QtGui>
        #include <QApplication>

        int main(int argc, char *argv[])
        {

        QApplication a(argc, argv);
        MainWindow w;
        w.show();
        w.resize(400, 450);

        return a.exec();
        }
    mainwindow.cpp

      #include "mainwindow.h"


    MainWindow:: MainWindow(QWidget *parent) :
        QMainWindow(parent)

    {

    CreateGui();

    }

    MainWindow::~MainWindow()
    {

    }


    void MainWindow::CreateGui()
    {

        QwtPlot *myPlot = new QwtPlot(centralWidget());
            QwtPlotCurve *courbe = new QwtPlotCurve("Courbe 1");
            QLineEdit *test = new QLineEdit;

            QVector<double> x(5);
            QVector<double> y(5);

            // On entre des valeurs
            for(int i=0;i<5;i++)
            {
                x.append((double)i);
                y.append((double)(5-i));
            }
            courbe->setSamples(x.data(),y.data(),x.size());
            myPlot->replot();

            courbe->attach(myPlot);
            QGridLayout *layout = new QGridLayout;
            layout->addWidget(myPlot, 0, 1);
            layout->addWidget(test,1,0);
            centralWidget()->setLayout(layout);


        }

      and mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QObject>
#include <QMainWindow>
#include<QLineEdit>
#include<QGridLayout>

#include <qwt_plot.h>
#include <qwt_plot_curve.h>

class MainWindow: public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent=0);
    ~MainWindow();
private:
 private slots:
    void CreateGui();
};







#endif // MAINWINDOW_H

person The Man    schedule 08.02.2014    source источник


Ответы (1)


в главном окне.h

CreateGui не является слотом, может и может быть, бот пока не привязан ни к какому коннекту(сигналу, слоту)

MainWindow(QWidget *parent=0); приходит без этого явного, я не знаю, что вы хотите сказать с явным. :S (с явным можно, спасибо @frank)

в mainwindow.cpp

вместо CentralWidget() вы должны добавить ключевое слово this и попытаться отобразить виджет MainWindow, который наследуется от QWidget.

что-то вроде этого:

на mainwindow.cpp:

void MainWindow::CreateGui()
{

    QwtPlot *myPlot = new QwtPlot(this);
    QwtPlotCurve *courbe = new QwtPlotCurve("Courbe 1");
    QLineEdit *test = new QLineEdit;

    QVector<double> x(5);
    QVector<double> y(5);

    // On entre des valeurs
    for(int i=0;i<5;i++)
    {
        x.append((double)i);
        y.append((double)(5-i));
    }
    courbe->setSamples(x.data(),y.data(),x.size());
    myPlot->replot();

    courbe->attach(myPlot);
    QGridLayout *layout = new QGridLayout;
    layout->addWidget(myPlot, 0, 1);
    layout->addWidget(test,1,0);
    this->setLayout(layout);


}



Или задайте для centralWidget какое-нибудь значение, поскольку нигде нет вызова setCentralWidget(QWidget*), как его называет @frank.

документ говорит, что centralWidget() вернет ноль, если это ранее не устанавливалось. и показывает ссылку на метод setCentralWidget(qwidget*) .

я добавил эту строку, которую @frank сказал в конструкторе.

this->setCentralWidget(new QWidget);

после этого тоже работает. я никогда не использовал эти методы раньше, но, видимо, последний способ является предпочтительным.

Привет!

person rccursach    schedule 08.02.2014
comment
в любом случае, «явные» и «слотовые» вещи не являются причиной сбоя вашей программы. Ошибка в CreateGui(). (где также первая C имени (любого) метода должна быть строчной). но два других ключевых слова просто усложняют очень простой пример. - person rccursach; 08.02.2014
comment
explicit это хороший стиль, и его следует сохранить. CentralWidget() также предпочтительнее этого (чтобы не нарушать общий макет главного окна), хотя setCentralwidget (новый QWidget) в начале действительно может быть причиной сбоя. Запуск его в отладчике может помочь. - person Frank Osterfeld; 08.02.2014
comment
@FrankOsterfeld, вы правы, но я указал в комментарии, что не эти две вещи вызывают ошибку seg, а метод centralWidget(). Я никогда не использовал CentralWidget, но теперь, когда я просмотрел документацию link, действительно существует setCentralWidget(), который, когда он установлен, как вы упомянули, CentralWidget() возвращает действительный указатель. Он всегда должен быть установлен, если вы используете CentralWidget()? я добавил строку this-›setCentralWidget(new QWidget); на конструкторе и дальше работает. - person rccursach; 09.02.2014
comment
спасибо, Фрэнк и rccursach, мой код теперь работает, но когда я пытаюсь добавить любую кнопку, кнопка остается в верхнем левом углу, я добавляю кнопку, как эта QGridLayout *layout = new QGridLayout; layout-›addWidget(myPlot, 0, 1); layout-›addWidget(test,1,0); QPushButton *StartButton= новый QPushButton(Start,this); QHBoxLayout *layout1 = новый QHBoxLayout; layout1-›addWidget(StartButton); QVBoxLayout *layoutprincipale=новый QVBoxLayout; layoutprincipale-›addLayout(макет); layoutprincipale-›addLayout(layout1); - person The Man; 09.02.2014
comment
если я не ошибаюсь, это потому, что вы делаете: новый QPushButton(Start,this), где это ваше MainWindow, но ваш график и макет были на другом QWidget, установленном на setCentralWidget(), поэтому вы должны сделать слишком новый QPushButton(Start ,centralWidget()), так что QWidget указателя CentralWidget является родителем добавленной вами кнопки, как и для макета. Удачи! - person rccursach; 09.02.2014