LINUX.ORG.RU

Динамический массив QWidget'ов.


0

0

Сразу скажу, что если кого я достал (а тут есть один товарсич которого я достал) можете не отвечать :))

Вообщем такая ситуация, есть класс, в коротом создаётся два массива QWidget'ов, оба они в какой то мере динамические, так вот, когда я туда пытаюсь добавить 4-ый элемент то прога валиться. Выяснилось это так, вообще эти виджеты должны добавляться динамически но пока прога ещё не на такой стадии готовности а пока надо проверить работу класса, добавляю три элемента, всё нормально, но как только пытаюся добавить четвёртый, так всё падает, т.е. когда пытаюсь запусить прогу оно валиться в сегфолт.

вызовы:
/*******************************************************************/
...
tmp = new QPixmap(*playlistw->space->backgroundPixmap());
playlisttabs = new kmmsTabs(playlistw->space->x(), playlistw->space->y(), playlistw->space->width(),
playlistw->space->height(), tmp, playlistw);
delete tmp;

QWidget *t = new QWidget;
t->resize(playlisttabs->space_width(), playlisttabs->space_height());
QWidget *t1 = new QWidget;
t1->resize(playlisttabs->space_width(), playlisttabs->space_height());
playlisttabs->addTab(t);
playlisttabs->addTab(t);
playlisttabs->addTab(t1);
// playlisttabs->addTab(t1); //Если его добавить то прога падает
/******************************************************************/

Обьявление:

QWidget **header;
QWidget **space;
QWidget **tmp;

метод класса:
/******************************************************************/
void tabs::addTab(QWidget *tab)
{
if(num_tabs == 0)
{
header = new QWidget*[1];
header[0] = new QWidget(this);
header[0]->resize(headerXSize,headerYSize);

space = new QWidget*[1];
space[0] = new QWidget(tab);
space[0]->reparent(this,QPoint(0,0)); // здесь не падает
space[0]->move(0, headerYSize + 10);
space[0]->resize(tab->width(), tab->height());
num_tabs++;
}
else
{
int n = num_tabs;

tmp = new QWidget *[n];
tmp = header;
delete header;

header = new QWidget*[n+1];
header = tmp;
header[n] = new QWidget(this);
header[n]->resize(headerXSize,headerYSize);
header[n]->move(n*(headerXSize+10),0);
delete tmp;

tmp = new QWidget *[n];
tmp = space;
delete space;

space = new QWidget*[n+1];
space = tmp;
delete tmp;

space[n] = new QWidget(tab);
// space[n]->reparent(this,QPoint(0,0)); // от этого тоже падает
space[n]->resize(tab->width(), tab->height());
num_tabs++;
}
}
/******************************************************************/

И ещё вопрос, не получается сменить родителя для элемента массива

space[n]->reparent(this,QPoint(0,0));

т.е. после вызова этой функции, прога так же падает. Без неё всё пашет, но она необходима, иначе никак. Так же хочу заметить что пока элемент в массиве только один, такой вызов работает.

P/S заранее прошу прощения если тут есть какое то ламерство.

Заранее спасибо!!!

★★★★★

Да и ещё, иногда, т.е. где то 1 из 20 прога может не запуститься и с 3-я элементами.

cyclon ★★★★★
() автор топика

Уважаемый cyclon, не просите о прощении, мы Вас не простим, за такое не прощают

tmp = new QWidget *[n]; tmp = space; delete space;

space = new QWidget*[n+1]; space = tmp; delete tmp;

Вы бы сели за руль самолета, если летать не умеете? А чего пишите, если не понимаете ничего. Изучайте чужой код и читайте книги. Первый вопрос, который у Вас должен возникнить:"В какой программе мне это посмотреть, в какой книге прочитать". А не про то, что можно запостить на форум, там ответят.

anonymous
()

есть такая мега прога gdb называется очень помогает

laad
()

а рвзве нельзя

space[n] = new QWidget(tab);
// space[n]->reparent(this,QPoint(0,0)); // от этого тоже падает

заменить на

space[n] = new QWidget(this);

?

Keiko
()
Ответ на: комментарий от Keiko

Во первых я понимаю что пишу, далее,

space[n] = new QWidget(tab); // space[n]->reparent(this,QPoint(0,0)); // от этого тоже падает

заменить на

space[n] = new QWidget(this);

может это вы не понимаете что тут имелось ввиду, а если не понимаете то не надо говорить, я же написал - это необходимо, дальше, я так уже делал, только вместо qwidget был qbushbutton, т.е. код был такой же и всё работало, а самолёт я водить не умею, сознаюсь, но он мне и не нужен. И не надо обвинять в незнании, а где такое смотреть я не знаю, т.е. не искал и код писал на основании одной книги, так что может это там ошибка, а может я не понял что автор имелл ввиду.

По поводу куска кода выше, это надо делать так потому что в этот класс передается виджет созданный в другом месте и который имеет уже родителя но по смыслу должен сменить родителя.

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

Всё проблемма решена, и если кто то будет по прежнему утверждать что я не умею водить самолёт, то я скажу, что код практически не изменился, т.е. то что я привёл осталось практически таким же, только вместо

void tabs::addTab(q *t)
{
if(num_tabs == 0)
{
space = new q[1];
space[0].w = new QWidget(t[0].w);
space[0].w->reparent(this,QPoint(0,0));
num_tabs++;
....

я добавил только статическую структуру, в которой опять же стоит динимический элемент, но объявлен не массив указателей а массив структур в которой указатель.

cyclon ★★★★★
() автор топика

>tmp = new QWidget *[n]; >tmp = header;

Шел бы ты вагоны грузить.... Ты хоть понимаешь что делает вышеприведенный участок кода? Что ты хотел чтобы он делал?

bd
()
Ответ на: комментарий от BreadFan

<offtopic>

Кстати, я недавно у кого-то тут на лоре уже видел подобный код.... Аааа!!! Это же был почетный анекдотостроитель альфекс!!! Все, так и запишем: cyclon - второй почетный анекдотостроитель лора :)

</offtopic>

bd
()
Ответ на: комментарий от bd

>tmp = new QWidget *[n]; >tmp = header;

так, начнём с того что этот кусок взят из книги, только там стоял не qwidget а другой класс, далее, как я понял, это должно создавать массив указателей размерностью n.

Если здесь что не так - так это от непонимания, звиняйте, учился по книжке, так что может там что имелось другое ввиду.

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

И у мя по сему вопрос, почему если все такие умные, то никто так толком и не смог указать на бред сразу, или же вы только обсирать других можете и называть баснописцами. Я конечно понимаю что мог полную хуйню сморозить, но можно было бы хотя бы сказать что вот эта строка есть хуйня и если сказать как правильно выше вашего достоинства, то могли бы вообще не отвечать, а обосрать я могу.

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

Блин, тебе в первом ответе сказали, что у тебя не правильно.

Если даже до этого дойти не можешь - разъясняю

tmp = new QWidget *[n];

/* Ну выделил ты массив размера n */

tmp = space;

/* Потерял указатель на выделенную память, затерев его значение на space */

delete space;

/* Освободил память на которую указывали space и tmp */

space = new QWidget*[n+1];

/* Выделил снова */

space = tmp;

/* Присвоил указателю space указатель на уже освобожденную память */

delete tmp;

/* Еще раз попытался освободить ту же память */

И чего ты хотел чтобы твоя программа делала после этого?

anonymous
()
Ответ на: комментарий от anonymous

Пардон, погорячился - теперь понятно, я не непонял одного почему же оно работает до некоторго количества элементов в массиве, или это совпадение?

cyclon ★★★★★
() автор топика
Ответ на: комментарий от anonymous

> И еще, нормальный программер на твоем месте использовал бы QObjectList

когда я затеял эту бадягу мне казалось что в qt был класс qvector, кажется я его там видел когда то, но поискав по ману последнего qt я его не нашёл, а о QObjectList я не знал.

cyclon ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.