UI вызывает SIGSEGV при доступе вне конструктора - PullRequest
0 голосов
/ 09 марта 2011

когда я пытаюсь получить доступ к интерфейсу извне конструктора, я получаю сигнал SIGSEGV ошибка в нижней строке в файле cpp внизу функции prepareQuestions

Я попытался уменьшить его до минимально возможного кода:

Заголовок:

#ifndef QUESTIONSDIALOG_H
#define QUESTIONSDIALOG_H

#include <QDialog>
#include <QHash>

#include "question.h"

namespace Ui {
    class QuestionsDialog;
}

class QuestionsDialog : public QDialog
{
    Q_OBJECT

public:
    explicit QuestionsDialog(QWidget *parent = 0);
    ~QuestionsDialog();
    void prepareQuestions(QString category);

private:
    Ui::QuestionsDialog *ui;
    QHash<QString, Question>* questions; //question id + question object
};

#endif // QUESTIONSDIALOG_H

cpp файл:

#include <QtDebug>
#include "questionsdialog.h"
#include "ui_questionsdialog.h"
#include "question.h"

QuestionsDialog::QuestionsDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::QuestionsDialog)
{
    ui->setupUi(this);
    ui->lbl_question1->setText(QString("this is the constructor")); //works
    ui->txt_input1->setText(QString("this is the constructor")); //works
}

QuestionsDialog::~QuestionsDialog()
{
    delete ui;
}

void QuestionsDialog::prepareQuestions(QString category){
    ui->lbl_question1->setText(QString("this is prepareQuestions method")); //doesn't work
//    ui->txt_input1->setText(QString("test1")); //creates an exception (no error message)
}

где я строю в основном

QStackedWidget *dialogStack = new QStackedWidget;
dialogStack->addWidget(new LoginDialog());     //index 0
dialogStack->addWidget(new CallDialog());      //index 1
dialogStack->addWidget(new CategoryDialog());  //index 2
dialogStack->addWidget(new QuestionsDialog()); //index 3

dialogStack->setCurrentIndex(0);

где я вызываю QuestionDialog, чтобы быть сверху:

QStackedWidget* dialogStack = (QStackedWidget*)this->parentWidget();
QuestionsDialog* questionDialog = ((QuestionsDialog*)dialogStack->widget(1));
//set type of call + properties
dialogStack->setCurrentIndex(3);

questionDialog->prepareQuestions(((QToolButton*)obj)->statusTip());

графический интерфейс, когда закомментирована строка ошибки (обратите внимание, что изменение lbl_question1 не работает) http://i77.photobucket.com/albums/j74/bertyhell/gui.png

ошибка при использовании отладчика:

http://i77.photobucket.com/albums/j74/bertyhell/seg_fault.png

1 Ответ

1 голос
/ 09 марта 2011

Вы используете неправильный индекс для получения объекта QuestionDialog из стека диалогов:

QuestionsDialog * questionDialog = ((QuestionsDialog *) dialogStack-> виджет (1));

Вместо «1» следует использовать «3».

...