Russian Qt Forum
Ноябрь 25, 2024, 04:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Динамическое создание виджета  (Прочитано 9070 раз)
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(), но не понял как им воспользоваться применительно к моему вопросу.
Буду признателен за пример с динамическим созданием виджета. Спасибо!

Записан
Bepec
Гость
« Ответ #1 : Август 22, 2012, 10:12 »

Судя по описанным вами эээ... знаниям, вам всё же стоит решить для себя - оно вам надо?

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

PS заповедь №N - учить С++, потом учить Qt.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Август 22, 2012, 10:44 »

Ну по имени не удастся, но можно сохранить указатель на виджет в контейнере
Код
C++ (Qt)
QVector <QTableView *> vecTbl;
QTableView *table = new QTableView;
..
vecTbl.push_back(table);
...
vecTbl.back()->show();
 
Записан
Bepec
Гость
« Ответ #3 : Август 22, 2012, 10:52 »

Тут обычная структура - 2 model-view, как в проводнике. И не надо сотни и тысячи tableView создавать Улыбающийся Достаточно одного.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Август 22, 2012, 11:42 »

Тут обычная структура - 2 model-view, как в проводнике. И не надо сотни и тысячи tableView создавать Улыбающийся Достаточно одного.
Я вижу. Но сначала надо ответить на вопрос а потом можно упомянуть нужно это или нет  Улыбающийся
Записан
Bepec
Гость
« Ответ #5 : Август 22, 2012, 12:00 »

Вынужден согласиться - ваша точка зрения более правильная Улыбающийся

Записан
Stek
Гость
« Ответ #6 : Август 22, 2012, 22:05 »

Igors спасибо!

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

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

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




 
Записан
Bepec
Гость
« Ответ #7 : Август 22, 2012, 22:19 »

Собственно почему я отписался? Потому что я вчера делал аналогичную модель для 30+ различных узлов с различными же параметрами Показает язык
View - одна. Делегаты ставятся спокойно. Данные опять же спокойно.

PS хотяяя, выбор дело ваше. Я сам пока допетрил до своей системы, штуки 4 сделал тестовых.
Записан
andrew.k
Гость
« Ответ #8 : Август 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. "...помни это, надпись на дуле его пистолета.." КАЧ (с)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Август 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
У диалога десятки виджетов, значит чтобы достучаться до элемента нужно выполнить десятки сравнений. Мало того, нужно еще создать временный контейнер который затем будет удален. Это что, логика языка? Никак нет, это логика заученных ф-ций (которыми, да, страшно удобно пользоваться, но которые, увы, - калечат морально неустойчивых  Улыбающийся)

А с критикой концепции согласен
Записан
andrew.k
Гость
« Ответ #10 : Август 23, 2012, 09:39 »

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

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Август 23, 2012, 14:26 »

Я же не говорил, что это хороший и быстрый способ, который всегда подходит. Просто было озвучено, что это невозможно, но это не так.
А, понял. Я имел ввиду "по имени переменной". А "по имени - property" конечно да
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.254 секунд. Запросов: 23.