crossplatform.ru

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


  Ответ в Использование parentWidget()
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
IvanYuS Дата 2.8.2009, 18:34
  Хорошая книга, спасибо за совет, а то C++ GUI Programming with Qt4 (1st edition) - конечно много знаний, но я в ней запутался. Да, формы я наследовал от QWidgetов... тут видать собака зарыта -)
MoPDoBoPoT Дата 2.8.2009, 18:25
  Я тут, однако, тоже тупанул... Считается, что у тебя это два окошка? Если да, то у inputform действительно не должно быть парента. Нет парента -> метод QWidget::parentWidget() вернет 0. Если хочешь окошко с парентом, то используй класс QDialog (наследуй класс InputForm от QDialog ).
IvanYuS Дата 2.8.2009, 18:10
 
Цитата(MoPDoBoPoT @ 2.8.2009, 19:02) *
Цитата(IvanYuS @ 2.8.2009, 18:48) *
Интересен еще такой вопрос, при создании формы в обработчеке клика на кнопке, кто будет родителем формы, кнопка или форма на которой находится кнопка?

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

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

Родителем бутет тот, чей указатель будет передан в конструктор формы. У вас пробелы в базовых понятиях. Рекомендую для начала почитать книгу Макса Шлее "Qt4. Профессиональное программирование на C++ ".
IvanYuS Дата 2.8.2009, 17:48
  нет тут правда в указателе дело
    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, 17:10
  Теперь проблема не в указателе, а в этом, скорей всего:
QString str = papa->metaObject()->className();

Метод QMetaObject::className() возвращает "const char*", а не "QString". Попробуй так:
QString str(papa->metaObject()->className());
IvanYuS Дата 2.8.2009, 16:36
 
#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, 16:18
 
Цитата(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:14
 
#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:03
  Все верно, segmentation fault и должен быть. Ты не задал родителя для inputform, а в коде пытаешься работать с ним (родителем), не проверив на его существование (в твоем случае метод parentWidget() возвратит 0).
При создании формы надо задать ей родителя:
InputForm *inputform = new InputForm(this);

Если конструктор класса InputForm не имеет параметров, значит надо чуток подправить его.
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 10.7.2025, 17:21