qt zwalnianie pamięci

0

Witam, stworzyłem interfejs użytkownika z ikonami, po kliknięciu na ikonę wyświetla się nowe okno (nowe ui). Ikony rysuję za pomocą:

 void Icon::mergeIconText(QLabel* label, const QPixmap& pix, const QString txt )
{

    QFont myFont("Helvetica", SIZE_ICON_FONT);
    QFontMetrics metrics(myFont);
    int strWidth = metrics.width(txt);
    int strHeight = metrics.height();
    int pixWidth = pix.width();
    int pixHeight = pix.height();

    QPixmap res( qMax(strWidth, pixWidth), strHeight + pixHeight + 6 );
    res.fill(Qt::transparent);
    QPainter p(&res);
    int start = qMax((strWidth-pixWidth)/2, 0);
    p.drawPixmap( start ,0, pix );
    p.setFont(myFont);
    int width = qMax(pixWidth, strWidth);
    p.drawText( QRect( 0,pixHeight, width, strHeight+6), Qt::AlignCenter, txt );

    label->setText("");
    label->setPixmap(res);
    label->setFixedSize(res.size());
}

W mainwindow.cpp mam wywołanie:

 
    Icon myIcon;
    aboutLabel = new ClickableLabel;
    myIcon.mergeIconText(aboutLabel, QPixmap(":/icons/icon/about.ico").scaled(QSize(SIZE_ICON,SIZE_ICON)), "Informacje" );
    ui->gridLayout->addWidget(aboutLabel,0,2,1,1);
    connect(aboutLabel, SIGNAL(clicked()), this, SLOT(aboutShowForm()) );


MainWindow::aboutShowForm()
{
        about = new About(this);
        about->show();        
}
 

Tak wygląda konstruktor i destruktor nowego okna.

About::About(QWidget *parent) :
    QMainWindow(parent,Qt::FramelessWindowHint),
    ui(new Ui::About)
{
    ui->setupUi(this);
    QWidget::showMaximized();
  
    Icon myIcon;
    backLabel = new ClickableLabel();
    myIcon.mergeIconText(backLabel, QPixmap(":/icons/icon/back.ico").scaled(QSize(SIZE_ICON,SIZE_ICON)), "" );
    ui->gridLayoutTool->addWidget(backLabel,0,0,1,1);
    connect(backLabel, SIGNAL(clicked()), this, SLOT(close()) );
}

About::~About()
{
    delete ui;
    delete backLabel;
    close();
}
 

W nowo otwartym oknie też mam ikony. Wszystko działa poprawnie oprócz tego, że po zamknięciu nowego okna nie zwalnia się pamieć po nim. Co jest nie tak?

0
about = new About(this);

A czy gdziekolwiek masz delete about?

0

@twonek Nie mam delete about

Gdzie ono powinno być wywołane? Wskaźnik about mam w clasie mainwindow, robiąc delete about w destruktorze mainwindow pamięć zwolni się zamykając główne okno. Zależy mi aby pamięć została zwolniona po zamknięciu okna About.

2

Problem jest taki, że about będzie żyło tak długo jak mainWindow. Na dodatek za każdym razem tworzysz nowe okienko about.
Musisz zmienić kod tak, by okienko samo się usuwało po zamknięciu.
Popatrz na Qt::WA_DeleteOnClose oraz setAttribute.
Czyli:

About::About(QWidget *parent) :
    QMainWindow(parent,Qt::FramelessWindowHint),
    ui(new Ui::About)
{
    ui->setupUi(this);
    setAttribute(Qt::WA_DeleteOnClose);
…

powinno załatwić sprawę.

0

setAttribute(Qt::WA_DeleteOnClose); rozwiązało problem.
Zatanawiam się czy w destruktorze About::~About() powinno byc:

delete backLabel;
close();

1 użytkowników online, w tym zalogowanych: 0, gości: 1