программа состоит из двух форм, первая MainForm содержит кнопку Input_Data, которая вызывает другую форму InputForm, которая содержит только кнопку QuitButton, код обработки нажатия на Input_Data:
void MainForm::on_Input_Data_clicked()
{
InputForm *inputform = new InputForm;
inputform->show();
inputform->activateWindow();
};
void InputForm::on_QuitButton_clicked()
{
QWidget * papa = parentWidget();
QString str = papa->metaObject()->className();
QuitButton->setText(str);
};
Ты бы код привел в котором InputForm создается. Ты ему родителя указываешь?
Все верно, segmentation fault и должен быть. Ты не задал родителя для inputform, а в коде пытаешься работать с ним (родителем), не проверив на его существование (в твоем случае метод parentWidget() возвратит 0).
При создании формы надо задать ей родителя:
InputForm *inputform = new InputForm(this);
#ifndef INPUTFORM_H
#define INPUTFORM_H
#include"ui_InputForm.h"
#include<QWidget>
class InputForm : public QWidget, public Ui::InputForm
{
Q_OBJECT;
public:
InputForm(QWidget *parent = 0);
private slots:
void on_QuitButton_clicked();
};
#endif // INPUTFORM_H
class InputForm : public QWidget, public Ui::InputForm
{
Q_OBJECT;
public:
InputForm(QWidget *parent = 0);
...
};
InputForm::InputForm(QWidget *parent = 0)
: [b]QWidget(parent)[/b]
{
...
}
...
InputForm *inputform = new InputForm[b](this)[/b];
...
#include "InputForm.h"
#include<QtGui>
InputForm::InputForm(QWidget *parent) : QWidget(parent)
{
setupUi(this);
};
void InputForm::on_QuitButton_clicked()
{
//см выше
};
#include "InputForm.h"
#include<QtGui>
InputForm::InputForm(QWidget *parent) : QWidget(parent)
{
setupUi(this);
};
void InputForm::on_QuitButton_clicked()
{
//см выше
};
#include "MainForm.h"
#include "InputForm.h"
MainForm::MainForm(QWidget *parent) : QWidget(parent)
{
setupUi(this);
};
void MainForm::on_Input_Data_clicked()
{
InputForm *inputform = new InputForm(this);
inputform->show();
inputform->activateWindow();
};
QuitButton->setText("Some text");
Теперь проблема не в указателе, а в этом, скорей всего:
QString str = papa->metaObject()->className();
QString str(papa->metaObject()->className());
нет тут правда в указателе дело
QWidget * papa = parentWidget();
if (papa==0) QuitButton->setText("papa=0");
else{
QString str = papa->metaObject()->className();
QuitButton->setText(str);
};
void MainForm::on_Input_Data_clicked()
{
InputForm *inputform = new InputForm;
inputform->show();
inputform->activateWindow();
};
void MainForm::on_Input_Data_clicked()
{
InputForm *inputform = new InputForm(this);
inputform->show();
inputform->activateWindow();
};
Я тут, однако, тоже тупанул... Считается, что у тебя это два окошка? Если да, то у inputform действительно не должно быть парента. Нет парента -> метод QWidget::parentWidget() вернет 0. Если хочешь окошко с парентом, то используй класс QDialog (наследуй класс InputForm от QDialog ).
Хорошая книга, спасибо за совет, а то C++ GUI Programming with Qt4 (1st edition) - конечно много знаний, но я в ней запутался. Да, формы я наследовал от QWidgetов... тут видать собака зарыта -)
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)