Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Stek от Август 22, 2012, 09:20



Название: Динамическое создание виджета
Отправлено: Stek от Август 22, 2012, 09:20
Здравствуйте!

Постараюсь поподробнее объяснить задачу. Необходимо динамически создавать большое кол-во объектов QTableView, с возможностью в дальнейшем обратиться к ним. Чтобы при каждом событии (например нажатии на кнопку) создавался новый tableview, с новым именем tableview_1, table_view_2 и т.д. Каждая отображаемая таблица будет связана с пунктом treewidget. При переходе по пунктам (item) соответствующая таблица скрывается/отображается. Скрыл table, отобразил table_1 и т.д. В дальнейшем нужно будет связать данные создаваемых table с treewidget.

Создаю так:

Код:
QTableView *table = new QTableView;

ui->gridLayout->addWidget(table);


mModel = new MyModel(0);

......

mModel->setTable("table");

......

table->show();


Собственно вопрос, как мне создавать tableview_1,table_view_2 и т.д., а затем обратиться к созданным виджетам по имени?

Нагуглил по теме про Qvector и метод push_back(), но не понял как им воспользоваться применительно к моему вопросу.
Буду признателен за пример с динамическим созданием виджета. Спасибо!



Название: Re: Динамическое создание виджета
Отправлено: Bepec от Август 22, 2012, 10:12
Судя по описанным вами эээ... знаниям, вам всё же стоит решить для себя - оно вам надо?

И да, в вашей ситуации нужна 1 TableView. Просто разные данные туда передавать или модели.

PS заповедь №N - учить С++, потом учить Qt.


Название: Re: Динамическое создание виджета
Отправлено: Igors от Август 22, 2012, 10:44
Ну по имени не удастся, но можно сохранить указатель на виджет в контейнере
Код
C++ (Qt)
QVector <QTableView *> vecTbl;
QTableView *table = new QTableView;
..
vecTbl.push_back(table);
...
vecTbl.back()->show();
 


Название: Re: Динамическое создание виджета
Отправлено: Bepec от Август 22, 2012, 10:52
Тут обычная структура - 2 model-view, как в проводнике. И не надо сотни и тысячи tableView создавать :) Достаточно одного.


Название: Re: Динамическое создание виджета
Отправлено: Igors от Август 22, 2012, 11:42
Тут обычная структура - 2 model-view, как в проводнике. И не надо сотни и тысячи tableView создавать :) Достаточно одного.
Я вижу. Но сначала надо ответить на вопрос а потом можно упомянуть нужно это или нет  :)


Название: Re: Динамическое создание виджета
Отправлено: Bepec от Август 22, 2012, 12:00
Вынужден согласиться - ваша точка зрения более правильная :)



Название: Re: Динамическое создание виджета
Отправлено: Stek от Август 22, 2012, 22:05
Igors спасибо!

Цитировать
Bepec
Судя по описанным вами эээ... знаниям, вам всё же стоит решить для себя - оно вам надо?
И да, в вашей ситуации нужна 1 TableView. Просто разные данные туда передавать или модели. 

Неее...я чисто попостить, чтобы на форуме было чего почитать на досуге людям  ;)

Одним tableview обойтись не получится. Изначально, создаётся дерево из 15 пунктов item в treewidget. Каждому item может быть присвоен один из 10 различных параметров (выбираются из выпадающего списка). Клик по item с присвоенным параметром отображает соответствующую ему таблицу из БД. Переход по пунктам - show/hide нужной таблицы. Сами таблицы различны, диапазоны допустимых значений, вводимых пользователем и прочее указываю посредством делегатов. Все 15 пунктов могут содержать как одинаковые параметры (но в тоже время пользователь может задать для них в таблице разные значения), так и разные. При всём при этом, дерево не ограничивается 15-ю пунктами, пользователь может добавить их ещё n-ное множество. Как-то так, надеюсь в общих чертах сумел объяснить.




 


Название: Re: Динамическое создание виджета
Отправлено: Bepec от Август 22, 2012, 22:19
Собственно почему я отписался? Потому что я вчера делал аналогичную модель для 30+ различных узлов с различными же параметрами :P
View - одна. Делегаты ставятся спокойно. Данные опять же спокойно.

PS хотяяя, выбор дело ваше. Я сам пока допетрил до своей системы, штуки 4 сделал тестовых.


Название: Re: Динамическое создание виджета
Отправлено: andrew.k от Август 22, 2012, 23:42
Ну по имени не удастся, но можно сохранить указатель на виджет в контейнере
Код
C++ (Qt)
QVector <QTableView *> vecTbl;
QTableView *table = new QTableView;
..
vecTbl.push_back(table);
...
vecTbl.back()->show();
 
Не правда ваша!
Код
C++ (Qt)
QObject::setObjectName(const QString &name)
+
QList<T> QObject::findChildren ( const QString & name = QString() ) const

Другое дело, что концепцию надо бы менять.
Плодить вьюхи, чтобы показывать разные таблицы из БД это жесть.

PS заповедь №N - учить С++, потом учить Qt.
Это заповедь №1, а не N. "...помни это, надпись на дуле его пистолета.." КАЧ (с)


Название: Re: Динамическое создание виджета
Отправлено: Igors от Август 23, 2012, 01:19
PS заповедь №N - учить С++, потом учить Qt.
Это заповедь №1, а не N. "...помни это, надпись на дуле его пистолета.." КАЧ (с)
Хмм... а давайте посмотрим на Ваше решение с точки зрения языка

Код
C++ (Qt)
QObject::setObjectName(const QString &name)
+
QList<T> QObject::findChildren ( const QString & name = QString() ) const
У диалога десятки виджетов, значит чтобы достучаться до элемента нужно выполнить десятки сравнений. Мало того, нужно еще создать временный контейнер который затем будет удален. Это что, логика языка? Никак нет, это логика заученных ф-ций (которыми, да, страшно удобно пользоваться, но которые, увы, - калечат морально неустойчивых  :))

А с критикой концепции согласен


Название: Re: Динамическое создание виджета
Отправлено: andrew.k от Август 23, 2012, 09:39
Код
C++ (Qt)
QObject::setObjectName(const QString &name)
+
QList<T> QObject::findChildren ( const QString & name = QString() ) const
У диалога десятки виджетов, значит чтобы достучаться до элемента нужно выполнить десятки сравнений. Мало того, нужно еще создать временный контейнер который затем будет удален. Это что, логика языка? Никак нет, это логика заученных ф-ций (которыми, да, страшно удобно пользоваться, но которые, увы, - калечат морально неустойчивых  :))
Я же не говорил, что это хороший и быстрый способ, который всегда подходит. Просто было озвучено, что это невозможно, но это не так.
Даже сомневаюсь, что способ соблазнителен для морально неустойчевых. Его можно применять либо от безысходности, либо от лени)
Тем более это как раз наш случай. Человек хочет создавать тучу вьюх) Вроде не безысходная ситуация, значит второе)


Название: Re: Динамическое создание виджета
Отправлено: Igors от Август 23, 2012, 14:26
Я же не говорил, что это хороший и быстрый способ, который всегда подходит. Просто было озвучено, что это невозможно, но это не так.
А, понял. Я имел ввиду "по имени переменной". А "по имени - property" конечно да