Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно указывается parent? 
:(
    Опции темы
dmitrio
Дата 22.8.2011, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



Изучаю QT за одно и C++. Так скажем самопальный новичек в C++. Вот не могу понять как правильно создавать конструкторы классов и указывать в них родителя??
В данное время создаю экземпляр QWizard
Файл mainwindow.h
Код

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui/QApplication>
#include <QSystemTrayIcon>
#include "wizard.h"
#include <QFile>
#include <QMainWindow>

class Wizard;

namespace Ui {
    class MainWindow;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
....
private:
    Wizard *wiz;
    Ui::MainWindow *ui;
...
}

Файл mainwindow.cpp
Код

...
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
...
    wiz = new Wizard;
}
MainWindow::~MainWindow()
{
    delete ui;
}

Файл wizard.h
Код

#ifndef WIZARD_H
#define WIZARD_H

#include <QWizard>
#include "mainwindow.h"
#include "QFile"

QT_BEGIN_NAMESPACE
class QLabel;
class QVBoxLayout;
class QHBoxLayout;
class QLineEdit;
class QRegExp;
class QFile;
QT_END_NAMESPACE

class Wizard : public QWizard
{
    Q_OBJECT

public:
    Wizard(QWidget *parent=0);
...
};

Файл wizard.cpp
Код

...
Wizard::Wizard(QWidget *parent)
    : QWizard(parent)
{
...
}

Я так понимаю все дело в объявлении класса Wizard в конструкторе, но не могу понять что указывать в конструкторе, уже опробовал много вариантов.
Сейчас работает так: открывается главное окно, потом вылазит окно мастера. Если закрыть главное окно, окно мастера остается открытым, но хотелось бы чтобы оно тоже закрылось. Я так понимаю тут дело в не правильном parent?
Спасибо за помощь
PM MAIL   Вверх
kosmonaFFFt
Дата 22.8.2011, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



1) Нет, тебе надо отловить событие главного окна, и закрыть в рбработчике дочернее...
2) Надо для родителя указывать не QWidget*, а QObject*
3) создавать так 
Код

wiz = new Wizard(this);

желательно в деструкторе сделать 
Код

delete wiz;



--------------------
user posted image
PM MAIL ICQ   Вверх
dmitrio
Дата 23.8.2011, 05:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



Спасибо, буду пробовать
PM MAIL   Вверх
dmitrio
Дата 23.8.2011, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



Уважаемый kosmonaFFFt, сделал как Вы сказали, что получилось:
1) Заменил:
Код

wiz = new Wizard;

на
Код

wiz = new Wizard(this);

Получилось что мастер стал встроенный в главное окно.
2) Заменил везде где стоит:
Код

QWidget *parent=0

на
Код

QObject *parent=0

В файлах .h и .cpp
Компилятор стал ругаться и выдает:
Код

../one/wizard.cpp: In constructor ‘Wizard::Wizard(QObject*)’:
../one/wizard.cpp:7: ошибка: некорректное преобразование из ‘QObject*’ в ‘QWidget*’
../one/wizard.cpp:7: ошибка:   при инициализации 1 -го аргумента ‘QWizardPage::QWizardPage(QWidget*)’
....
../one/wizard.cpp: In constructor ‘onePage::onePage(QObject*)’:
../one/wizard.cpp:24: ошибка: некорректное преобразование из ‘QObject*’ в ‘QWidget*’
../one/wizard.cpp:24: ошибка:   при инициализации 1 -го аргумента ‘QWizardPage::QWizardPage(QWidget*)’

Что не так делаю?

Это сообщение отредактировал(а) dmitrio - 24.8.2011, 06:06
PM MAIL   Вверх
dmitrio
Дата 25.8.2011, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



Вроде бы немного разобрался, замена с QWidget на QObject в конструкторах выдавала кучу ошибок, вернул обратно.
Оставил:
Код

    wiz = new Wizard(this);

Но окно Wizarda было как будто вросшим в MainWindow
Когда-то помнится ставил флаг для wizard
Код

   setWindowFlags(Qt::WindowStaysOnTopHint);

убрал его и о чудо, окно мастера стало нормальным и закрывается сразу после того как закрывается главное окно.
Но без вопросов конечно никак. 
1) Я так понимаю раз окно мастера закрывается после закрытия главного окна значит оно в памяти не оседает?
Но по хорошему наверное деструктор все-таки делать надо?
Видимо у меня еще хорошие проблемы с областью видимости переменных ну и много в чем, поэтому прошу помощи:
В объявлении класса MainWindow (mainwindow.h) в секции private я объявляю:
Код

class MainWindow : public QMainWindow
{
....
private:
    Wizard *wiz;
....
};

В конструкторе класса MainWindow (mainwindow.cpp) я указываю:
Код

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
....
    wiz = new Wizard(this);
}

В объявлении класса Wizard (wizard.h) я указываю:
Код

class Wizard : public QWizard
{
...
public:
    Wizard(QWidget *parent=0);
    ~Wizard();
};

В конструкторе класса Wizard (wizard.cpp) я указываю:
Код

...
Определенные действия...
...

В деструкторе класса Wizard:
Код

     delete wiz;

На что само собой понятно компилятор ругается:
Код

ошибка: нет декларации ‘wiz’ в этой области видимости

В чем не правда, поставьте пожалуйста на путь истинный
Или я не там где надо создаю объект wiz, или я не там где надо создаю деструктор или ...
2) Как управлять видимостью главного окна пока в зоне видимости Wizard?
Ну например что бы в главном не работали менюшки и т.д
Делаю в главном:
Код

setEnabled(false);

но оно мне главное и мастера делает с такими параметрами
PM MAIL   Вверх
dmitrio
Дата 29.8.2011, 07:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



1) Нашел в интернетах (понятно что ответ есть в любой книге по С++) что если объект создается именно с this, то при удалении родителя он удалится тоже:
т.е правильно создавать так:
Код

    wiz = new Wizard(this);

а не так:
Код

    wiz = new Wizard();

2) Пока управлением видимостью главного окна решил управлением видимостью виджетов на главном окне

Тут меня озадачили новые вопросы. Вопросы до сих пор связаны с QWizard. Я хочу сделать простейший сбор информации с qwizardpage 1 и дальнейший вывод ее на qwizardpage 2. 
Делаю так:
Конструктор Qwizard:
Код

class Wizard : public QWizard
{
    Q_OBJECT

public:
    Wizard(QWidget *parent=0);
};
Wizard::Wizard(QWidget *parent)  
    : QWizard(parent)
{
    addPage(new onePage);
    addPage(new twoPage);
    addPage(new threePage);
    setWindowIcon(QIcon("dialog-information.png"));
....
    setFixedSize(640, 480);

    connect(this, SIGNAL(accepted()), this, SLOT(setVisibleMainWindow()));
    connect(button(QWizard::CancelButton), SIGNAL(clicked()), this, SLOT(showPressCancelButton()));
}

Конструктор onePage:
Код

class onePage : public QWizardPage
{
    Q_OBJECT

public:
    onePage(QWidget *parent = 0);
};
onePage::onePage(QWidget *parent)  
    : QWizardPage(parent)
{
    setPixmap(QWizard::WatermarkPixmap, QPixmap("watermark1.png"));
    setTitle("lalala");
    label = new QLabel("lalala");
    label->setWordWrap(true);

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(label);
    setLayout(layout);
}

Конструктор twoPage:
Код

class twoPage : public QWizardPage
{
    Q_OBJECT

public:
    twoPage(QWidget *parent = 0);

private slots:
    void isErrorName(QString login);
    void isErrorPas(QString password);

private:
    QRegExp *trueLogin;
    QRegExp *truePas;
    QLabel *labelName;
    QLabel *labelNameError;
    QLabel *labelPasError;
    QLabel *labelPass;
    QLabel *loginCharacter;
    QLabel *pasCharacter;
    QVBoxLayout *vlayout1;
    QHBoxLayout *hlayout1;
    QHBoxLayout *hlayout2;
    QLineEdit *nameEdit;
    QLineEdit *passEdit;
    QFile *db;

    bool isComplete() const;
    bool isLogin;
    bool isPassword;
};
twoPage::twoPage(QWidget *parent)   //Конструктор второй страницы мастера
    : QWizardPage(parent)
{
    QVBoxLayout *vlayout1 = new QVBoxLayout;
    QHBoxLayout *hlayout1 = new QHBoxLayout;
    QHBoxLayout *hlayout2 = new QHBoxLayout;
    setTitle("lalala");
    setSubTitle("lalallal");
    labelName = new QLabel(tr("Пожалуйста введите имя пользователя:*"));
    labelNameError = new QLabel;                                         
    labelPass = new QLabel(tr("Пожалуйста введите пароль пользователя:"));
    loginCharacter = new QLabel;                              
    loginCharacter->setText("<span style='font-size: 9px'>*Разрешается использовать только латинский алфавит</font>");
    pasCharacter = new QLabel;
    pasCharacter->setText("<span style='font-size: 9px'>*Разрешается использовать только латинский алфавит</font>");
    nameEdit = new QLineEdit;                                        
    registerField("nameEdit*", nameEdit);                       
        hlayout1->addWidget(nameEdit); 
        hlayout1->addStretch();
        hlayout1->addWidget(labelNameError);
    passEdit = new QLineEdit;                                          
    labelPasError = new QLabel;                            
    nameEdit->setMaximumWidth(150);          
    passEdit->setMaximumWidth(150);
    passEdit->setEchoMode(QLineEdit::Password);   
    registerField("passEdit*", passEdit);
        hlayout2->addWidget(passEdit);
        hlayout2->addStretch();
        hlayout2->addWidget(labelPasError);

        vlayout1->addWidget(labelName);
        vlayout1->addLayout(hlayout1);
        vlayout1->addWidget(loginCharacter);
        vlayout1->addWidget(labelPass);
        vlayout1->addLayout(hlayout2);
        vlayout1->addWidget(pasCharacter);
        setLayout(vlayout1);

        connect(nameEdit, SIGNAL(textChanged(QString)), this, SLOT(isErrorName(QString)));
        connect(passEdit, SIGNAL(textChanged(QString)), this, SLOT(isErrorPas(QString)));
}

Проверка правильности введенного имени в twoPage:
Код

void twoPage::isErrorName(QString login) //
{
    QRegExp trueLogin("(([A-z0-9]{0,}[А-я]{1,}[A-z0-9]{0,})?([0-9]{1,})?)");
    if (trueLogin.exactMatch(login))
    {
        labelNameError->setText(tr("<span style='font-size: 9px; color: red'>Ошибка логина</span>"));
    }
    else
    {
        labelNameError->setText("");
        setField("nameEdit", login);              //Это значение, проверенное на правильность (login) хочу передать следующей странице 
    }
}

Конструктор третьей страницы:
Код

class threePage : public QWizardPage
{
    Q_OBJECT

public:
    threePage(QWidget *parent = 0);

private:
    QLabel *label;
    QVBoxLayout *layout;
    QVariant *login;
    QString *text;
    void initializePage();
};
threePage::threePage(QWidget *parent)   //Конструктор третьей страницы
    : QWizardPage(parent)
{
    QVariant login(field("nameEdit"));
    QMessageBox::warning(0, login.toString(), login.toString(),1,2);
    setPixmap(QWizard::WatermarkPixmap, QPixmap("watermark1.png"));
    setTitle(tr("Поздравляем!!!"));
    label = new QLabel (text);
    label->setWordWrap(true);
    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(label);
    setLayout(layout);   
}

Смысл в том, что при запуске этого кода сразу появляется на экране  пустой QMessageBox::warning из threePage, если его закрываем то появляется главное окно и окно мастера.
Я понимаю, что конструктор это инициализация всего содержимого и видимо оно из-за этого и получается так. Но никак не пойму как мне сделать то, что я хочу, т.е 1) проверить правильность ввода имени 2) сделать setField для этого имени, если оно правильное и 3)в следующем qwizardpage вывести на экран с помощью field значение сохраненное при помощи setField 

PM MAIL   Вверх
dmitrio
Дата 30.8.2011, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



Спасибо всем за участие, разобрался, оказывается надо использовать initializePage и будет нам счастье, если будут еще вопросы по qwizard буду задавать сюда (хотя есть ли смысл  smile ) А нет, так создам новую тему


Это сообщение отредактировал(а) dmitrio - 30.8.2011, 15:06
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0467 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.