Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Jkc от Апрель 05, 2012, 12:46



Название: Динамическое добавление таба и удаление в QTabWidget
Отправлено: Jkc от Апрель 05, 2012, 12:46
В процессе работы программа получает данные ,
далее по их результату, должны появляться, изменяться, удаляться  НОВЫЕ ТАБЫ
в эти табы  встроены таблицы с данными, данные могут быть 
редактированными людьми или программой.

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


Название: Re: Динамическое добавление таба и удаление в QTabWidget
Отправлено: V1KT0P от Апрель 05, 2012, 13:16
В процессе работы программа получает данные ,
далее по их результату, должны появляться, изменяться, удаляться  НОВЫЕ ТАБЫ
в эти табы  встроены таблицы с данными, данные могут быть 
редактированными людьми или программой.

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

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


Название: Re: Динамическое добавление таба и удаление в QTabWidget
Отправлено: Bepec от Апрель 05, 2012, 13:19
Это возможно. Это реально. Это просто. Это стандартный функционал. QTabWidget.

А вот заполнение и контроль за данными будет на твоей совести.

2 V1KT0P - удаляться будут виджеты, а вот информация останется при правильной архитектуре.


Название: Re: Динамическое добавление таба и удаление в QTabWidget
Отправлено: iroln от Апрель 05, 2012, 13:56
При добавлении таба создается новый виджет и все объекты связанные с ним делай его детьми, тогда при удалении виджета уничтожится и все остальное.
При добавлении таба новый виджет не создаётся. При добавлении нового таба необходимо уже существующий виджет передать в метод addTab. Кстати при удалении таба (removeTab) сам виджет не удаляется, об этом тоже надо помнить, удаляется только страница из TabWidget. Это я всё к чему написал, а к тому, что можно очень легко сделать неправильно, тогда при динамическом добавлении/удалении страниц будет течь память и могут появится всякие глюки.


Название: Re: Динамическое добавление таба и удаление в QTabWidget
Отправлено: Bepec от Апрель 05, 2012, 14:09
Виджеты удаляются, если в качестве родителя был указан таб, который будет удаляться :)

А сделать так, чтобы текла память и windows падала в БСОД - можно очень просто и без особых усилий.

PS при правильной архитектуре и правильном плане спокойно создаётся всё и удаляется без потерь.


Название: Re: Динамическое добавление таба и удаление в QTabWidget
Отправлено: Jkc от Апрель 05, 2012, 14:25
Виджеты удаляются, если в качестве родителя был указан таб, который будет удаляться :)

А сделать так, чтобы текла память и windows падала в БСОД - можно очень просто и без особых усилий.

PS при правильной архитектуре и правильном плане спокойно создаётся всё и удаляется без потерь.
Случайно нет примера по архитектуре?


Название: Re: Динамическое добавление таба и удаление в QTabWidget
Отправлено: iroln от Апрель 05, 2012, 14:32
Виджеты удаляются, если в качестве родителя был указан таб, который будет удаляться :)
"Таб" - это чисто виртуальный элемент, отображение. Ты понимаешь под "табом" виджет-страницу, который передаётся в TabWidget? Если так, то конечно, только я имею ввиду, что этот самый виджет-страница не удаляется при удалении таба (removeTab), то есть если требуется очистить память, занимаемую этим виджетом-страницей, нужно его удалять вручную.


Название: Re: Динамическое добавление таба и удаление в QTabWidget
Отправлено: Bepec от Апрель 05, 2012, 14:40
Да, я имел в виду собственно удаление страницы-виджета ;)

Кхм. Дык на каждую задачу нужно своё делать. Точнее не так - я незнаю ваших задач, объёмов и прочих деталей.


Название: Re: Динамическое добавление таба и удаление в QTabWidget
Отправлено: Jkc от Апрель 05, 2012, 14:56
как создать динамически создать таб я знаю, и как его заполнить и добавть то же, а вот как сделать механизм изменения данных


Название: Re: Динамическое добавление таба и удаление в QTabWidget
Отправлено: Bepec от Апрель 05, 2012, 14:57
Сигнал слоты.

Неизвестно какие данные и прочая прочая прочая, устал уже писать и мысли читать одновременно :D


Название: Re: Динамическое добавление таба и удаление в QTabWidget
Отправлено: Jkc от Апрель 05, 2012, 15:15
да какая разница какие данные, ну например
-----------------------------------------------
<dtata_tab>
  <id>1</id>
  <action>CREATE</action>
  <info>
      <name>Vasia</name>
     <phone>45644</phone>
  </info>
  <id>2</id>
  <action>CREATE</action>
  <info>
      <name>Kolia</name>
     <phone>222333</phone>
  </info>  
    
action == CREATE                                  
 тут мы добавили 2 новых таба с данными
т.е. в реале данных много , я их запихиваю в класс привязываю к модели модель к нужному виджету и сам виджет в
tabWidget->addVidget(MyWidget)                                                  
  --------------------------------------------------//
 далее приходит новые данные

<dtata_tab>
  <id>1</id>
  <action>DELETE</action>
  <info>
      <name>Vasia</name>
     <phone>45644</phone>
  </info>
  <id>2</id>
  <action>EDIT</action>
  <info>
      <name>Kolia</name>
     <phone>9999</phone>
  </info>    

вот тут мне нужно удалить ВАСЮ
и поменять телефон у Коли, пока я не могу понять
как мне к ним добраться, по какому признаку найти нужный таб
получить доступ к таблице и т.п.
--
В голову лезет делать что то типа map<mess_id, tab_id>
но возможно есть более элегантное решение


Название: Re: Динамическое добавление таба и удаление в QTabWidget
Отправлено: Jkc от Апрель 05, 2012, 15:18
да какая разница какие данные, ну например
-----------------------------------------------
<dtata_tab>
  <id>1</id>
  <action>CREATE</action>
  <info>
      <name>Vasia</name>
     <phone>45644</phone>
  </info>
  <id>2</id>
  <action>CREATE</action>
  <info>
      <name>Kolia</name>
     <phone>222333</phone>
  </info>  
    
action == CREATE                                  
 тут мы добавили 2 новых таба с данными
т.е. в реале данных много , я их запихиваю в класс привязываю к модели модель к нужному виджету и сам виджет в
tabWidget->addVidget(MyWidget)                                                  
  --------------------------------------------------//
 далее приходит новые данные

<dtata_tab>
  <id>1</id>
  <action>DELETE</action>
  <info>
      <name>Vasia</name>
     <phone>45644</phone>
  </info>
  <id>2</id>
  <action>EDIT</action>
  <info>
      <name>Kolia</name>
     <phone>9999</phone>
  </info>    

вот тут мне нужно удалить ВАСЮ
и поменять телефон у Коли, пока я не могу понять
как мне к ним добраться, по какому признаку найти нужный таб
получить доступ к таблице и т.п.
--
В голову лезет делать что то типа map<mess_id, tab_id>
но возможно есть более элегантное решение


Название: Re: Динамическое добавление таба и удаление в QTabWidget
Отправлено: Bepec от Апрель 05, 2012, 15:25
Создай мапу, или лист.  Любой контейнер, хоть вектор.

Ну и соответственно привяжи приходящие данные к нему.

В принципе всё.

PS Если непонятно, то
Код:
void changeEvent(MyEnum::dataOperation x)
{
// 3 функции адд делете редактирование  допустим
}

// cписок структур, в которых хранятся твои данные
QList<struct> listData


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


Название: Re: Динамическое добавление таба и удаление в QTabWidget
Отправлено: Jkc от Апрель 05, 2012, 17:15
Тут такая загвоздочка выходит,  я пошел по пути получению данных в самой модели

void TxTableModel::slotSetXmlData(int tye_doc, const QByteArray & xml)
{
    newDataCreator( tye_doc);   // тут мы создаем нужный нам объект ДАТА  по типу документа

    beginResetModel();

    QXmlInputSource inputSource;
    QXmlSimpleReader reader;

    XmlParserHandler handler(m_DataPtr); 

    inputSource.setData(xml);

    reader.setContentHandler(&handler);
    reader.setErrorHandler(&handler);
    reader.parse(inputSource);

    endResetModel();
}

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


Название: Re: Динамическое добавление таба и удаление в QTabWidget
Отправлено: Bepec от Апрель 05, 2012, 17:48
Ааах, у вас ещё и иксемель???? Да ещё и tableView??? Зачем тогда вы нам морочите головы табами?


Название: Re: Динамическое добавление таба и удаление в QTabWidget
Отправлено: Jkc от Апрель 06, 2012, 09:41
Ааах, у вас ещё и иксемель???? Да ещё и tableView??? Зачем тогда вы нам морочите головы табами?

>данных много , я их запихиваю в класс Data
>привязываю к модели модель к нужному
> виджету и сам виджет в НОВЫЙ таб.

просто я так понял что нельзя в моем случае создавать класс Data внутри Model
нужно  создать объект Data и передать указатель на данные в модель ,ну и замапить указатель на данные
далее при получении новых данных, менять их через указатель взятый из мапы.
Вот пока думаю как получить доступ к табам для удаления   
p.s.
данные приходят не только в xml