crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Использование parentWidget()
IvanYuS
  опции профиля:
сообщение 2.8.2009, 15:11
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 27.7.2009
Пользователь №: 948

Спасибо сказали: 0 раз(а)




Репутация:   0  


программа состоит из двух форм, первая MainForm содержит кнопку Input_Data, которая вызывает другую форму InputForm, которая содержит только кнопку QuitButton, код обработки нажатия на Input_Data:
void MainForm::on_Input_Data_clicked()
{
    InputForm *inputform = new InputForm;
    inputform->show();
    inputform->activateWindow();
};

на второй форме клик на кнопке QuitButton обрабатывается так
void InputForm::on_QuitButton_clicked()
{
    QWidget * papa = parentWidget();
    QString str = papa->metaObject()->className();
    QuitButton->setText(str);
};

Больше на формах ничего нет. Программа компилится, первая кнопка работает нормально - появляется вторая форма, при нажатии на вторую кнопку программа вылетает с ошибкой segmentation fault, мне кажется я неправильно обращаюсь с указателем papa, подскажите учащемуся пожалуйста в чем ошибка и как правильно тут поступить.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
den'ka
  опции профиля:
сообщение 2.8.2009, 15:36
Сообщение #2


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 8.8.2008
Пользователь №: 258

Спасибо сказали: 4 раз(а)




Репутация:   0  


Ты бы код привел в котором InputForm создается. Ты ему родителя указываешь?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MoPDoBoPoT
  опции профиля:
сообщение 2.8.2009, 16:03
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

Спасибо сказали: 44 раз(а)




Репутация:   9  


Все верно, segmentation fault и должен быть. Ты не задал родителя для inputform, а в коде пытаешься работать с ним (родителем), не проверив на его существование (в твоем случае метод parentWidget() возвратит 0).
При создании формы надо задать ей родителя:
InputForm *inputform = new InputForm(this);

Если конструктор класса InputForm не имеет параметров, значит надо чуток подправить его.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
IvanYuS
  опции профиля:
сообщение 2.8.2009, 16:14
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 27.7.2009
Пользователь №: 948

Спасибо сказали: 0 раз(а)




Репутация:   0  


#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

ui_InputFomr.h - получаю в Qt дизайнере, имя формы выставляю InputForm, вставляю кнопку называю ее QuitButton

Цитата(MoPDoBoPoT @ 2.8.2009, 17:03) *
[code]InputForm *inputform = new InputForm(this);[\code]

При добавлении (this) - программа компилится, но при нажатии на кнопку первой формы зависает - кнопка не отживается, окошко не появляется.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MoPDoBoPoT
  опции профиля:
сообщение 2.8.2009, 16:18
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

Спасибо сказали: 44 раз(а)




Репутация:   9  


Цитата(IvanYuS @ 2.8.2009, 17:06) *
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];
...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
IvanYuS
  опции профиля:
сообщение 2.8.2009, 16:36
Сообщение #6


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 27.7.2009
Пользователь №: 948

Спасибо сказали: 0 раз(а)




Репутация:   0  


#include "InputForm.h"
#include<QtGui>

InputForm::InputForm(QWidget *parent) : QWidget(parent)
{
    setupUi(this);
};
void InputForm::on_QuitButton_clicked()
{
   //см выше
};

Да, реализация выглядет подобно, но только при добавлении (this) программа компилится, но не работает должным образом(см выше).

Цитата(IvanYuS @ 2.8.2009, 17:24) *
#include "InputForm.h"
#include<QtGui>

InputForm::InputForm(QWidget *parent) : QWidget(parent)
{
    setupUi(this);
};
void InputForm::on_QuitButton_clicked()
{
   //см выше
};

Да, реализация выглядет подобно, но только при добавлении (this) программа компилится, но не работает должным образом(см выше).

Раскрывающийся текст
#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 заменить на
QuitButton->setText("Some text");

то все работает замечательно, не вылетает.... все-таки дело в указателе -(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MoPDoBoPoT
  опции профиля:
сообщение 2.8.2009, 17:10
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

Спасибо сказали: 44 раз(а)




Репутация:   9  


Теперь проблема не в указателе, а в этом, скорей всего:
QString str = papa->metaObject()->className();

Метод QMetaObject::className() возвращает "const char*", а не "QString". Попробуй так:
QString str(papa->metaObject()->className());
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
IvanYuS
  опции профиля:
сообщение 2.8.2009, 17:48
Сообщение #8


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 27.7.2009
Пользователь №: 948

Спасибо сказали: 0 раз(а)




Репутация:   0  


нет тут правда в указателе дело
    QWidget * papa = parentWidget();
    if (papa==0) QuitButton->setText("papa=0");
        else{
                QString str = papa->metaObject()->className();
                QuitButton->setText(str);
            };

Прописывает на кнопке papa=0, понять не могу... как так, я же форму создаю при щелчке на кнопку, у нее же должен быть родитель...

И при замене
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();
};

Вторая форма при работе программы не открывается... вот это я совсен монять не могу -(

Интересен еще такой вопрос, при создании формы в обработчеке клика на кнопке, кто будет родителем формы, кнопка или форма на которой находится кнопка?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MoPDoBoPoT
  опции профиля:
сообщение 2.8.2009, 18:02
Сообщение #9


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

Спасибо сказали: 44 раз(а)




Репутация:   9  


Цитата(IvanYuS @ 2.8.2009, 18:48) *
Интересен еще такой вопрос, при создании формы в обработчеке клика на кнопке, кто будет родителем формы, кнопка или форма на которой находится кнопка?

Родителем бутет тот, чей указатель будет передан в конструктор формы. У вас пробелы в базовых понятиях. Рекомендую для начала почитать книгу Макса Шлее "Qt4. Профессиональное программирование на C++ ".
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
IvanYuS
  опции профиля:
сообщение 2.8.2009, 18:10
Сообщение #10


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 27.7.2009
Пользователь №: 948

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(MoPDoBoPoT @ 2.8.2009, 19:02) *
Цитата(IvanYuS @ 2.8.2009, 18:48) *
Интересен еще такой вопрос, при создании формы в обработчеке клика на кнопке, кто будет родителем формы, кнопка или форма на которой находится кнопка?

Родителем бутет тот, чей указатель будет передан в конструктор формы. У вас пробелы в базовых понятиях. Рекомендую для начала почитать книгу Макса Шлее "Qt4. Профессиональное программирование на C++ ".

Ну я то в общем не программист, просто надо было кое-что запрогать, пока разбирался, втянулся -) Спасибо за ссылку на книгу -)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 15.9.2019, 17:34