PDA

View Full Version : Seg Fault with multiple QDialogs



kroenecker
21st March 2009, 14:31
It has been a while since I tried programming using QT so I might be doing something very newbish.

Here is the situation:
--Ubuntu 8.10
--QT 4.5 binary install that includes Qt Creator 1.0

Application:
--MainWindow with two dialog boxes

I autogenerate the dialog code using Qt Creator so I have two classes that are called Ui_Dialog and Ui_Dialog2.

When I try to initialize them in the MainWindow constructor the entire application seg faults when it is run.

Here is the code:



#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui/QMainWindow>
#include <QDialog>

namespace Ui
{
class Dialog;
class Dialog2;
class MainWindowClass;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
MainWindow(QWidget *parent = 0);
~MainWindow();

private:
QDialog dOne;
QDialog dTwo;

Ui::MainWindowClass *ui;
Ui::Dialog *p_dOne;
Ui::Dialog2 *p_dTwo;
};

#endif // MAINWINDOW_H




#include "mainwindow.h"
#include "ui_dialog.h"
#include "ui_dialog2.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindowClass)
{
ui->setupUi(this);
p_dOne->setupUi(&dOne);
p_dTwo->setupUi(&dTwo);
}

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





/************************************************** ******************************
** Form generated from reading ui file 'dialog.ui'
**
** Created: Sat Mar 21 22:13:51 2009
** by: Qt User Interface Compiler version 4.5.0
**
** WARNING! All changes made in this file will be lost when recompiling ui file!
************************************************** ******************************/

#ifndef UI_DIALOG_H
#define UI_DIALOG_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QDialog>
#include <QtGui/QDialogButtonBox>
#include <QtGui/QGridLayout>
#include <QtGui/QHeaderView>
#include <QtGui/QLabel>

QT_BEGIN_NAMESPACE

class Ui_Dialog
{
public:
QGridLayout *gridLayout;
QLabel *label;
QDialogButtonBox *buttonBox;

void setupUi(QDialog *Dialog)
{
if (Dialog->objectName().isEmpty())
Dialog->setObjectName(QString::fromUtf8("Dialog"));
Dialog->resize(400, 100);
gridLayout = new QGridLayout(Dialog);
gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
label = new QLabel(Dialog);
label->setObjectName(QString::fromUtf8("label"));

gridLayout->addWidget(label, 0, 0, 1, 1);

buttonBox = new QDialogButtonBox(Dialog);
buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialo gButtonBox::Ok);

gridLayout->addWidget(buttonBox, 1, 0, 1, 1);


retranslateUi(Dialog);
QObject::connect(buttonBox, SIGNAL(accepted()), Dialog, SLOT(accept()));
QObject::connect(buttonBox, SIGNAL(rejected()), Dialog, SLOT(reject()));

QMetaObject::connectSlotsByName(Dialog);
} // setupUi

void retranslateUi(QDialog *Dialog)
{
Dialog->setWindowTitle(QApplication::translate("Dialog", "Dialog", 0, QApplication::UnicodeUTF8));
label->setText(QApplication::translate("Dialog", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
"<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Dialog One</p></body></html>", 0, QApplication::UnicodeUTF8));
Q_UNUSED(Dialog);
} // retranslateUi

};

namespace Ui {
class Dialog: public Ui_Dialog {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_DIALOG_H




/************************************************** ******************************
** Form generated from reading ui file 'dialog2.ui'
**
** Created: Sat Mar 21 22:15:00 2009
** by: Qt User Interface Compiler version 4.5.0
**
** WARNING! All changes made in this file will be lost when recompiling ui file!
************************************************** ******************************/

#ifndef UI_DIALOG2_H
#define UI_DIALOG2_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QDialog>
#include <QtGui/QDialogButtonBox>
#include <QtGui/QGridLayout>
#include <QtGui/QHeaderView>
#include <QtGui/QLabel>

QT_BEGIN_NAMESPACE

class Ui_Dialog2
{
public:
QGridLayout *gridLayout;
QLabel *label;
QDialogButtonBox *buttonBox;

void setupUi(QDialog *Dialog2)
{
if (Dialog2->objectName().isEmpty())
Dialog2->setObjectName(QString::fromUtf8("Dialog2"));
Dialog2->resize(400, 100);
gridLayout = new QGridLayout(Dialog2);
gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
label = new QLabel(Dialog2);
label->setObjectName(QString::fromUtf8("label"));

gridLayout->addWidget(label, 0, 0, 1, 1);

buttonBox = new QDialogButtonBox(Dialog2);
buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialo gButtonBox::Ok);

gridLayout->addWidget(buttonBox, 1, 0, 1, 1);


retranslateUi(Dialog2);
QObject::connect(buttonBox, SIGNAL(accepted()), Dialog2, SLOT(accept()));
QObject::connect(buttonBox, SIGNAL(rejected()), Dialog2, SLOT(reject()));

QMetaObject::connectSlotsByName(Dialog2);
} // setupUi

void retranslateUi(QDialog *Dialog2)
{
Dialog2->setWindowTitle(QApplication::translate("Dialog2", "Dialog", 0, QApplication::UnicodeUTF8));
label->setText(QApplication::translate("Dialog2", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
"<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Dialog Two</p></body></html>", 0, QApplication::UnicodeUTF8));
Q_UNUSED(Dialog2);
} // retranslateUi

};

namespace Ui {
class Dialog2: public Ui_Dialog2 {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_DIALOG2_H


The last two are automatically generated. I cannot figure out why initializing them both in the MainWindow constructor would cause a seg fault!!!

Lykurg
21st March 2009, 15:09
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindowClass)
{
ui->setupUi(this);
p_dOne->setupUi(&dOne);
p_dTwo->setupUi(&dTwo);
}


p_dOne and p_dTwo are NULL pointer! try:

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindowClass), p_dOne(new Ui::Dialog), p_dTwo(new Ui::Dialog2)
{

kroenecker
21st March 2009, 15:21
Hahahaha. Good catch that has to be it. Now I'm embarrassed.