crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> сортировка элементов Сцены
genusatplay
  опции профиля:
сообщение 11.12.2008, 14:32
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 50
Регистрация: 8.11.2008
Пользователь №: 416

Спасибо сказали: 0 раз(а)




Репутация:   0  


народ помогите плиз советом..
у меня есть QGraphicScene
на котором я создаю (class DiagramItem : public QGraphicsPolygonItem) в диаграм итеме храниться полигон и инфа(параметры)
я подобавлял на форму итемов, поредактил их
терь нада все сохранить в файл xml.. но вот в чем проблема..
итемы добавлялись в сцену в произвольном порядке.. мне нужно отсортировать их слева направа сверху вниз
по их координатам x,y относительно полотна
а потом выгрузить в файл и еще отнимать от Элемент_списка.x Предыдуший_элемент.x чтоб в итоге получать
в шаблоне отступ относительно предыдущего элемента.
мб есть какиенибудь стандартные фичи для такой сортировки?
если нет.. подскажите как мне это сделать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 11.12.2008, 19:03
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Для стандартной сортировки моешь посмотреть: qSort или QStableSort.

Но не уверен, что в твоем случае это может помочь, я думаю тебе нужно самому писать сортировку для входящего объекта структуры:
struct sCrd
{
   int nX;
   int nY;
   int nDiff;
};
и уже в ней менять nDiff.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
genusatplay
  опции профиля:
сообщение 12.12.2008, 12:09
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 50
Регистрация: 8.11.2008
Пользователь №: 416

Спасибо сказали: 0 раз(а)




Репутация:   0  


чтото типа такого надо..
на код такой не ругается, но он и неработает
int icount = (diagramScene->items().count()-1);
for (int i=0; i < icount;i++ )
{
    for (int j=icount;j > i;j-- )
    {
        DiagramItem *ditem1 = qgraphicsitem_cast<DiagramItem *>(diagramScene->items().at(j-1));
        DiagramItem *ditem2 = qgraphicsitem_cast<DiagramItem *>(diagramScene->items().at(j));
        if ( ditem1->pos().y() > ditem2->pos().y() )
        {
            diagramScene->items().swap(j-1,j);
        }
    }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 12.12.2008, 13:08
Сообщение #4


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Ты когда-нибудь сортировку реализовавыл сам руками? Это чисто для информации, чтобы знать...
Где ты данный код выполняешь?
Как вызываешь?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
genusatplay
  опции профиля:
сообщение 12.12.2008, 22:35
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 50
Регистрация: 8.11.2008
Пользователь №: 416

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(ViGOur @ 12.12.2008, 13:08) *
Ты когда-нибудь сортировку реализовавыл сам руками? Это чисто для информации, чтобы знать...
Где ты данный код выполняешь?
Как вызываешь?

этот код выполняется в слоте сохранения шаблона в mainwindow'е моем, после сортировки идет выгрузка в xml
вызываю при срабатывании действия сохранения в меню
да писал, у меня самый любимый способ сортировки такой:
Раскрывающийся текст
// Language C#
using System;
using System.Collections.Generic;
using System.Text;
using System.Globalization;
using System.Threading;



namespace laba
{
class Program
{
static void Main(string[] args)
{
int buf;
int i,j,n;
Boolean qwe;
qwe = true;

Console.WriteLine("Введите размерность массива");
n = int.Parse(Console.ReadLine());
int[] a = new int[n];

for (i = 0; i < n; i++)
{
Console.WriteLine("Введите {0:d} элемент массива", i);
a[i] = int.Parse(Console.ReadLine());
}

Console.WriteLine("---------");
for (int k = 0; k < a.Length; k++)
{ Console.WriteLine(a[k]); }
Console.WriteLine("---------");

DateTime dtb = DateTime.Now; //datetime before
CultureInfo ci = new CultureInfo("de-DE");



while (qwe)
{
Random randObj = new Random();
i = randObj.Next(a.Length);
j = randObj.Next(a.Length);

buf = a[j];
a[j] = a[i];
a[i] = buf;

int f = 0;
for (int h = 0; h < a.Length - 1; h++)
{
if (a[h] > a[h + 1]) { f = f + 1; }
}
if (f > 0 ) { qwe = true;}
else { qwe = false; }

}

DateTime dta = DateTime.Now; //datetime after
DateTime time = DateTime.Now;
long vrema;
//time = dta.Millisecond - dtb.Millisecond;

Console.WriteLine("Время работы программы {0:d} миллисекнуд.",vrema.ToString());
Console.WriteLine(vrema.ToString());
Console.WriteLine(time.ToString("d", ci));

for (int k = 0; k < a.Length; k++)
{ Console.WriteLine(a[k]); }
Console.ReadKey();
}
}
}

когда сдавал эту лабу, преподавателю понравился метод..

Сообщение отредактировал genusatplay - 12.12.2008, 22:38
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.12.2008, 22:56
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(genusatplay @ 12.12.2008, 15:09) *
но он и неработает
а что значит не работет?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
genusatplay
  опции профиля:
сообщение 12.12.2008, 23:10
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 50
Регистрация: 8.11.2008
Пользователь №: 416

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 12.12.2008, 22:56) *
Цитата(genusatplay @ 12.12.2008, 15:09) *
но он и неработает
а что значит не работет?

то что после его выплнения выгрузка в xml идет последовательно от 1ого элемента QGraphicsScene до последнего, и после выгрузки я получаю резултьтат
<shablon>
   <text name="text01">
      <pox_y>300</pos_y>
      ...
   </text>
<text name="text02">
   <pos_y>100</pos_y>
    ...
</text>
...
<shablon>

те выгружается в том порядке в котором я элементы заносил, а должно было: сначала элемент text02 потом text01

Цитата(ViGOur @ 11.12.2008, 19:03) *
struct sCrd
{
   int nX;
   int nY;
   int nDiff;
};

а можно какнить отсортировать Qlist<sCrd> qSort'ом просто определив ему чтоб он сортировал по nY?

Сообщение отредактировал genusatplay - 12.12.2008, 23:11
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.12.2008, 23:11
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


genusatplay, давай еще раз про сортировку, без выгрузки в XML (как говорится "мухи отдельно, котлеты отдельно")
Есть декартова плоскость, на ней точки с координатами X,Y. По какой траектории обходится декартова плоскость?
1) слева на право, затем сверху в низ;
2) сверху в низ, затем слева на право;

или как-то еще?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
genusatplay
  опции профиля:
сообщение 12.12.2008, 23:30
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 50
Регистрация: 8.11.2008
Пользователь №: 416

Спасибо сказали: 0 раз(а)




Репутация:   0  


мне впринципе слева направо пока ненадо..
сверху вниз и того хватит =)
те сортировка ток по Y , чтоб самый толстый в конце был
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.12.2008, 0:00
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


тогда яб так сделал:
взял QMap <int, DiagramItem*>
где int - координата по Y,
напихал бы в цикле в него элементы, а потом бы стал их вынимать по одному (их QMap по ключу сам отсортирует) и писать в XML.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.12.2024, 10:16