crossplatform.ru

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

6 страниц V  « < 2 3 4 5 6 >  
Ответить в данную темуНачать новую тему
> Создание неограниченного количества элементов
RazrFalcon
  опции профиля:
сообщение 12.8.2010, 22:28
Сообщение #31


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


Алексей1153, что значит показать, у меня обычно они так видны (все что я таким способом создавал), а при setVisible/show просто отдельный виджет появляется с graphicsViev. Циклом твои тоже ничего не видно, хотя компилит. Спасибо за цикл кстати.
Litkevich Yuriy, ну их создается ровно столько сколько нужно, циклом, так что лишних нет.
я же писал, что то типа раскадровки гиф/видео, там же их будет 1000-чи...

Сообщение отредактировал RazrFalcon - 12.8.2010, 22:33
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 12.8.2010, 22:43
Сообщение #32


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


RazrFalcon, ну, предположим, он видим. Но ты указатель на родительский виджет не передаёшь
Цитата
new QGraphicsView();

может, тут сябака порылась? )


Цитата(RazrFalcon @ 13.8.2010, 1:28) *
что то типа раскадровки гиф/видео, там же их будет 1000-чи...


достаточно столько вьюх, сколько влезет на экран. Остальное - организовать "логическое окно" просмотра (вроде как цепь протягивают в трубе, а в трубе есть 5 отверстий - видно одновременно 5 кадров-звеньев)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 12.8.2010, 23:14
Сообщение #33


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


Алексей1153, спасибо за идею попробую ограничится только влезшими на экран.
Спасибо всем, все работает.
Создаем:
    QList<QGraphicsView *> list;
    for(int i=0;i<10;i++)
    {
       list.append(new QGraphicsView(this));
    }
Изменяем:
int x=0, y=0;
   for (int i=0; i<list.count();i++)
   {
      list[i]->setGeometry(x,y,50,50);
      x+=51;
      y+=51;
    }

PS (this) помог, я как то раньше не обращал внимания.
PSS еще б с этим разобраться =)

Сообщение отредактировал RazrFalcon - 12.8.2010, 23:18
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 13.8.2010, 6:45
Сообщение #34


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


RazrFalcon, ещё два момента:

1) поскольку QList<QGraphicsView *> list предположительно - член класса, то перед циклом заполнения не забывай проверить, сколько элементов уже есть в списке. Не забывай также удалить через delete (как вариант, можно сделать оболочку для указателя, чтобы не приходилось вызывать delete вручную - щас приведу ниже)

Раскрывающийся текст
//вумный указатель для хранения в векторе и иже с ним
    template<typename T>
    struct s_VectorPtr
    {
        T* m_p;

        s_VectorPtr()
        {
            m_p=0;
        }

        s_VectorPtr(const s_VectorPtr& o2)
        {
            m_p=0;
            (*this)=o2;
        }

        void createIfNotYet()
        {
            if(!m_p)
            {
                m_p=new T;
            }
        }

        ~s_VectorPtr()
        {
            if(m_p)
            {
                delete m_p;
                m_p=0;
            }
        }

        void operator=(const s_VectorPtr& o2)
        {
            if(m_p)
            {
                delete m_p;
                m_p=0;
            }

            T* p=o2.m_p;
            ((s_VectorPtr&)o2).m_p=0;
            m_p=p;
        }

        T* operator ->()
        {
            return m_p;
        }
    };


//обявление теперь выглядит так
QList< s_VectorPtr<QGraphicsView> > list;//тут "*" не надо!


теперь, если изменение размера вектора влечёт за собой удаление элементов, delete вызовется автоматом


2)число 10 - это от балды. Тут следует сделать динамическую прикидку количества вьюх

Сообщение отредактировал Алексей1153 - 13.8.2010, 20:32
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 13.8.2010, 7:59
Сообщение #35


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


Алексей1153, для чего столько всего в деструкторе? ;)
    ~s_VectorPtr()
    {
        if(m_p)
        {
            delete m_p;
            m_p=0;
        }
    }


достаточно просто:
    ~s_VectorPtr()
    {
        delete m_p;
    }


По стандарту delete умеет работать с 0-указателями, он их проверяет и ничего не удаляет.
Зануление указателя в деструкторе тоже бессмыслено, сразу после этого объект все равно разрушиться.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 13.8.2010, 8:05
Сообщение #36


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


BRE, проверка if(m_p) здесь обязательна: смотри работу operator= :) Стандарт стандартом, но грабли потом искать не хочется, если что

ну а обнуление висячего указателя - это просто полезная привычка

Сообщение отредактировал Алексей1153 - 13.8.2010, 8:06
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 13.8.2010, 8:07
Сообщение #37


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


Цитата(Алексей1153 @ 13.8.2010, 9:05) *
BRE, проверка if(m_p) здесь обязательна: смотри работу operator= :)

В деструкторе, перед delete?
А для чего? :)

Цитата(Алексей1153 @ 13.8.2010, 9:05) *
ну а обнуление висячего указателя - это просто полезная привычка

Самая полезная привычка в программировании это постоянно думать что делаешь, а не полагаться на автоматизм.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 13.8.2010, 8:11
Сообщение #38


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


Цитата(BRE @ 13.8.2010, 11:07) *
перед delete

именно перед ним :) Про грабли я уже сказал, а ещё, бывает, люди переопределяют delete. Автоматизмом тут не пахнет

Ну а думать - это всегда пожалуйста, работа такая )) Но некоторые вещи отработаны до автоматизЬма - это экономит время и сокращает глюки (и колическтво разъярённых клиентов)

Поэтому, если так сильно хочется, можно и удалить "лишний код", но это бессмысленно - на быстродействии это не скажется всё равно
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 13.8.2010, 8:16
Сообщение #39


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


Цитата(Алексей1153 @ 13.8.2010, 9:11) *
именно перед ним :) Про грабли я уже сказал, а ещё, бывает, люди переопределяют delete. Автоматизмом тут не пахнет

Именно перед ним эта проверка абсолютно бессмысленна.
Какие грабли?
А если люди переопределяют delete, то делают эту проверку первой. Как-то странно забыть ее сделать в delete и не забывать ее делать во всех остальных местах. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 13.8.2010, 8:20
Сообщение #40


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


Хорошо, пусть будет так:

    ~s_VectorPtr()
    {
#ifdef BRE
        delete m_p;
#else
        if(m_p)
        {
            delete m_p;
            m_p=0;
        }
#endif
    }


;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 30.11.2024, 14:48