Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt GUI _ QGridLayout отжирает 200мб памяти

Автор: Andrewshkovskii 9.4.2010, 2:28

В цикле "хитро" размещаю сабклас от QPushButton :

    int k,l=0;
    for(int i=0;i<etalons.size();++i)
    {
            ui->gridLayout->addWidget(etalons[i],k,l);
            if(l!=2)
                ++l;
            else
                {
                    l=0;
                    ++k;
                }
    }

Ну там по 3 кнопки в строке.
И отрижает это дело почему-то 200мб оперативки.
А если просто через addWidget(* QWidget), то все нормально.
с чего может быть такое поведение?

Автор: SABROG 9.4.2010, 8:42

Где-то я уже видел эту программу...

Без исходников сложно сказать что-либо.

Автор: Andrewshkovskii 9.4.2010, 11:42

Интересно где, если я её вчера начал писать?:))
А какие исходники?Вся загвоздка в этом цикле идет, если сделать простое добавление (без указания номера строки и столбца) то все нормально.
Добавил код :

Раскрывающийся текст
#ifndef ETALON_H
#define ETALON_H

#include <QPushButton>
#include <QPixmap>
#include <QFile>
#include <QDataStream>
#include <QIcon>


class Etalon : public QPushButton
{
Q_OBJECT

private:
    QFile * etalonFile_;
    QPixmap * picture_;

public:
    explicit Etalon(QWidget *parent = 0);
    Etalon (QString name);
    QString getName() {return this->text();};
    QPixmap * picture() {return this->picture_;};
    void setPixmap(QPixmap  pixmap) {delete picture_; this->picture_ = new QPixmap(pixmap);};
    signed int state;// -1 - nothing, 0 - new, 1 - name edited, 2 - image edited, 3- name and image edited

signals:

public slots:
    void updateIcon();
};

#endif // ETALON_H


Раскрывающийся текст
#include "etalon.h"
#include <QDebug>

Etalon::Etalon(QWidget *parent) :
    QPushButton(parent)
{
     picture_ = new QPixmap(240,240);//empty pixmap
     picture_->fill();
}

Etalon::Etalon(QString name)
{
    this->state=-1;
    this->setText(name);
    picture_ = new QPixmap();
    if(picture_->load(".\\images\\"+this->text()+".PNG"))
           this->updateIcon();
}

void Etalon::updateIcon()
{
    this->setIcon(QIcon(*picture_));
}


Храняться эталоны в векторе. добовляются на интерфейс вот так вот :
void MainWindow::setEtalonsButton()
{
    int k,l=0;
    for(int i=0;i<etalons.size();++i)
    {
            ui->gridLayout->addWidget(etalons[i],k,l);
            if(l!=2)
                ++l;
            else
               {
                   l=0;
                   ++k;
                }
    }
}



Автор: DIMEDROLL 9.4.2010, 13:38

etalons
переменная какой тип?
надеюсь виджеты там не по значению

я бы попробовал подебажить и глянуть чем addWidget(QWidget*) отличается от addWidget ( QWidget * widget, int row, int column, Qt::Alignment alignment = 0 )
видимо первая это:
void QLayout::addWidget ( QWidget * w )

а вторая:
void QGridLayout::addWidget ( QWidget * widget, int row, int column, Qt::Alignment alignment = 0 )

вот и смотрите чем их внутринности отличаются...
З.Ы переменные называть буквой l не ходится, ибо читается она как 1(единица) ;)

Автор: Andrewshkovskii 9.4.2010, 13:49

etalons вектор Etalon, а Etalon Эт сабкласс от QPushbutton.
Спасибо, сейчас посмотрю именно код..
Ну у меня в QtCreator все нормально читается:)

Автор: BRE 9.4.2010, 13:52

void MainWindow::setEtalonsButton()
{
    int k,l=0;
    ...
}

Что ожидается от этой конструкции?

Переменная k - не инициализированна. Может быть большое прибольшое число. ;)

Автор: Andrewshkovskii 9.4.2010, 13:59

Ох моя память..подумал про множественную инициализацую в таком виде и сгрешил..простите:)
Спасибо!

Автор: SABROG 10.4.2010, 15:07

Цитата(Andrewshkovskii @ 9.4.2010, 12:42) *
Интересно где, если я её вчера начал писать?:))


:) да нет, давно ты её уже пишешь:



http://www.forum.crossplatform.ru/index.php?showtopic=3907&st=0

Автор: Andrewshkovskii 10.4.2010, 22:12

Оффтопик мы с тобой щас разведем!Это было простой рекогнайзер, алгоритм другой. А сейчас почти такая же, только алгоритм другой, любые символы.в общем другая лаба:)Ту программу я давно донаписал!

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)