Russian Qt Forum

Qt => Общие вопросы => Тема начата: dr_Begemot от Апрель 28, 2010, 12:35



Название: Где удаляются данные из сгенерированых ui?
Отправлено: dr_Begemot от Апрель 28, 2010, 12:35
Уважаемые, возник такой вопрос...
Есть вот такой сгенерированный UI файл:
Код:
/********************************************************************************
** Form generated from reading UI file 'AxisPropertyDlg.ui'
**
** Created: Wed 7. Apr 14:46:10 2010
**      by: Qt User Interface Compiler version 4.6.2
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/

#ifndef UI_AXISPROPERTYDLG_H
#define UI_AXISPROPERTYDLG_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QDialog>
#include <QtGui/QGridLayout>
#include <QtGui/QHBoxLayout>
#include <QtGui/QHeaderView>
#include <QtGui/QSpacerItem>
#include <QtGui/QStackedWidget>
#include <QtGui/QToolButton>
#include <QtGui/QTreeView>
#include <QtGui/QWidget>

QT_BEGIN_NAMESPACE

class Ui_AxisPropertyDlg
{
public:
    QGridLayout *gridLayout;
    QTreeView *treeView;
    QStackedWidget *stackedWidget;
    QWidget *[b]page[/b];
    QWidget *[b]page_2[/b];
    QHBoxLayout *[b]horizontalLayout[/b];
    QToolButton *btnAxisAdd;
    QSpacerItem *[b]horizontalSpacer[/b];
    QToolButton *btnAxisDependAdd;
    QSpacerItem *[b]horizontalSpacer_2[/b];
    QToolButton *btnAxisRemove;

    void setupUi(QDialog *AxisPropertyDlg)
    {
        if (AxisPropertyDlg->objectName().isEmpty())
            AxisPropertyDlg->setObjectName(QString::fromUtf8("AxisPropertyDlg"));
        AxisPropertyDlg->resize(692, 546);
        AxisPropertyDlg->setMinimumSize(QSize(660, 546));
        gridLayout = new QGridLayout(AxisPropertyDlg);
        gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
        treeView = new QTreeView(AxisPropertyDlg);
        treeView->setObjectName(QString::fromUtf8("treeView"));

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

        stackedWidget = new QStackedWidget(AxisPropertyDlg);
        stackedWidget->setObjectName(QString::fromUtf8("stackedWidget"));
        stackedWidget->setMinimumSize(QSize(438, 493));
        [b]page = new QWidget();[/b]
        page->setObjectName(QString::fromUtf8("page"));
        stackedWidget->addWidget(page);
        [b]page_2 = new QWidget();[/b]
        page_2->setObjectName(QString::fromUtf8("page_2"));
        stackedWidget->addWidget(page_2);

        gridLayout->addWidget(stackedWidget, 0, 1, 2, 1);

        [b]horizontalLayout = new QHBoxLayout();[/b]
        horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
        btnAxisAdd = new QToolButton(AxisPropertyDlg);
        btnAxisAdd->setObjectName(QString::fromUtf8("btnAxisAdd"));
        QIcon icon;
        icon.addFile(QString::fromUtf8(":/images/operations/add.png"), QSize(), QIcon::Normal, QIcon::Off);
        btnAxisAdd->setIcon(icon);

        horizontalLayout->addWidget(btnAxisAdd);

        [b]horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);[/b]

        horizontalLayout->addItem(horizontalSpacer);

        btnAxisDependAdd = new QToolButton(AxisPropertyDlg);
        btnAxisDependAdd->setObjectName(QString::fromUtf8("btnAxisDependAdd"));
        btnAxisDependAdd->setEnabled(false);

        horizontalLayout->addWidget(btnAxisDependAdd);

        horizontalSpacer_2 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);

        horizontalLayout->addItem(horizontalSpacer_2);

        btnAxisRemove = new QToolButton(AxisPropertyDlg);
        btnAxisRemove->setObjectName(QString::fromUtf8("btnAxisRemove"));
        QIcon icon1;
        icon1.addFile(QString::fromUtf8(":/images/operations/remove.png"), QSize(), QIcon::Normal, QIcon::Off);
        btnAxisRemove->setIcon(icon1);

        horizontalLayout->addWidget(btnAxisRemove);


        gridLayout->addLayout(horizontalLayout, 1, 0, 1, 1);

        QWidget::setTabOrder(treeView, btnAxisAdd);
        QWidget::setTabOrder(btnAxisAdd, btnAxisDependAdd);
        QWidget::setTabOrder(btnAxisDependAdd, btnAxisRemove);

        retranslateUi(AxisPropertyDlg);

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

    void retranslateUi(QDialog *AxisPropertyDlg)
    {
        AxisPropertyDlg->setWindowTitle(QApplication::translate("AxisPropertyDlg", "\320\240\320\265\320\264\320\260\320\272\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265 \321\201\320\262\320\276\320\271\321\201\321\202\320\262: \320\236\321\201\320\270", 0, QApplication::UnicodeUTF8));
#ifndef QT_NO_TOOLTIP
        btnAxisAdd->setToolTip(QApplication::translate("AxisPropertyDlg", "\320\224\320\276\320\261\320\260\320\262\320\270\321\202\321\214 \320\276\321\201\321\214", 0, QApplication::UnicodeUTF8));
#endif // QT_NO_TOOLTIP
        btnAxisAdd->setText(QApplication::translate("AxisPropertyDlg", "...", 0, QApplication::UnicodeUTF8));
        btnAxisDependAdd->setText(QApplication::translate("AxisPropertyDlg", "\320\224\320\276\320\261\320\260\320\262\320\270\321\202\321\214\320\267\320\260\320\262\320\270\321\201\320\270\320\274\321\203\321\216 \320\276\321\201\321\214", 0, QApplication::UnicodeUTF8));
#ifndef QT_NO_TOOLTIP
        btnAxisRemove->setToolTip(QApplication::translate("AxisPropertyDlg", "\320\243\320\264\320\260\320\273\320\270\321\202\321\214 \320\276\321\201\321\214", 0, QApplication::UnicodeUTF8));
#endif // QT_NO_TOOLTIP
        btnAxisRemove->setText(QApplication::translate("AxisPropertyDlg", "...", 0, QApplication::UnicodeUTF8));
    } // retranslateUi

};

namespace Ui {
    class AxisPropertyDlg: public Ui_AxisPropertyDlg {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_AXISPROPERTYDLG_H

Обратите внимание, на выделенное жирным шрифтом!
Например page = new QWidget();, память выделяется, однако указатель на родителя не передается. Вопрос: Когда будет удален page?
Если бы было сгенерировано page = new QWidget(AxisPropertyDlg); - другое дело! При вызове деструктора у AxisPropertyDlg вызывался бы деструктор page. А так, непонятно как будет удаляться.

Спасибо)


Название: Re: Где удаляются данные из сгенерированых ui?
Отправлено: BRE от Апрель 28, 2010, 12:39
Эти виджеты добавляются в layout'ы и в этот момент им назначается parent.


Название: Re: Где удаляются данные из сгенерированых ui?
Отправлено: alexman от Апрель 28, 2010, 15:33
В int QStackedWidget::addWidget ( QWidget * widget ) вызывается функция
Код:
void QLayout::addChildWidget(QWidget *w)
{
    QWidget *mw = parentWidget();
    QWidget *pw = w->parentWidget();
    ...
    if (!pw && mw)
        w->setParent(mw);
    ...
}


Название: Re: Где удаляются данные из сгенерированых ui?
Отправлено: Alex Custov от Апрель 28, 2010, 17:33
Цитировать
int QStackedWidget::addWidget ( QWidget * widget )
Appends the given widget to the QStackedWidget and returns the index position. Ownership of widget is passed on to the QStackedWidget.

If the QStackedWidget is empty before this function is called, widget becomes the current widget.