Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Majestio от Август 04, 2013, 20:11



Название: QTableWidget vs QTableView (холиварчик)
Отправлено: Majestio от Август 04, 2013, 20:11
Всегда пользовал QTableView ...

Но часто вижу что народ работает с QTableWidget.
Выскажитесь плс, какие методы/способы использования QTableWidget могут существенно сократить время программинга, размер кода в сравнении с QTableView?  ???


Название: Re: QTableWidget vs QTableView (холиварчик)
Отправлено: Bepec от Август 04, 2013, 20:13
Создание модели, реализация драг енд дропа, реализация стороннего взаимодействия.

Лишний класс с базовым функционалом - зачем? :P


Название: Re: QTableWidget vs QTableView (холиварчик)
Отправлено: Majestio от Август 04, 2013, 20:19
Лишний класс с базовым функционалом - зачем? :P
Вот и я о том же, как еще говорят - и доступ к данным ячеек у QTableWidget через Ж  ;D


Название: Re: QTableWidget vs QTableView (холиварчик)
Отправлено: Bepec от Август 04, 2013, 21:21
Я это говорил про QTableView + модель (две сущности) :P
Против QTableWidget (одна сущность) :)



Название: Re: QTableWidget vs QTableView (холиварчик)
Отправлено: Majestio от Август 04, 2013, 21:50
Я это говорил про QTableView + модель (две сущности) :P
Против QTableWidget (одна сущность) :)

Погоди, а что для QTableWidget служит источником данных?


Название: Re: QTableWidget vs QTableView (холиварчик)
Отправлено: gil9red от Август 04, 2013, 21:52
Тоже модель, но она "встроенная" :)


Название: Re: QTableWidget vs QTableView (холиварчик)
Отправлено: kambala от Август 04, 2013, 22:13
по идее *Widget потребляет больше памяти, чем *View, особенно разница будет заметна на больших объемах данных


Название: Re: QTableWidget vs QTableView (холиварчик)
Отправлено: Bepec от Август 04, 2013, 22:44
Вот пошли комментарии по делу :)

Да, памяти она сожрёт больше, ибо она многофункциональнее :) А на малых объемах *Widget быстрее и проще. Как говорится если ты уверен, что количество элементов ограничено  и будет меньше пары сотен, можно смело использовать *Widget


Название: Re: QTableWidget vs QTableView (холиварчик)
Отправлено: Majestio от Август 04, 2013, 23:15
Тоже модель, но она "встроенная" :)

Т.е. все, что "встроено" сущностью не считается?  ;D

Вопрос намба ту ... для себя я принял за правило хорошего тона - делать модель не "хранилищем", а "средством доступа к данным". Иными словами:

- умеет читать данные из источника
- умеет распределять ресурсы
- умеет кешировать
- умеет сортировать (для последующего чтения)
- умеет фильтровать (для последующего чтения)
- умеет отдавать запрошенное в результате

... все это делает что-то другое (другой класс или набор процедур) ... А модель должна только уметь получать и обработав, предоставлять. Есть один минус этого подхода - изменение данных и последующую запись в БД через модель я не делаю (вместо этого записываю непосредственно и обновляю). Но минусом я это не считаю, ибо подход прошел полевые испытания и очень таки успешно. Транзакции и блокировки при многопользовательском доступе реализуются вполне приемлемо по объему кодирования и понятности. Практически "копи-паста". Критикуйте!  ;D

Вопрос намбе сри ... Каков функционал встроенной модели? Встроенная модель может, к примеру, отдавать данные из трех принципиально разных источников, предварительно их скомбинировав? Например, из БД, датчика оборотов системного кулера, текущих параметров NDIS?


Название: Re: QTableWidget vs QTableView (холиварчик)
Отправлено: Bepec от Август 05, 2013, 09:51
1) Не считается. Она скрыта от меня ;) И у меня в файле отсутствует класс модели как таковой.

2) Что критиковать? Это свободный выбор. Пусть я не имею пока знаний по кеширования /фильтровке и прочему - это ваш выбор и ваш путь. Аналогично использованию QThread - кто-то наследуется, кто-то moveToThread туда свои классы.

3) Вы не путайте базовый функционал и специфический. Базовый - представить таблицу. Он им обладает. Все действия с таблицей реализованы.
Специфический - заполнение и изменение данных лежит на вас и ... Та дааам - да, вы можете читать данные из трёх источников и менять их в таблице.

PS не пытайте ровнять лопату и мотокультиватор.
Лопатой при должном умении можно сделать всё.
Мотокультиватор же делает специфические вещи лучше и быстрее лопаты, но только их ;)


Название: Re: QTableWidget vs QTableView (холиварчик)
Отправлено: Akon от Август 05, 2013, 13:48
*Widget классы это Item-based technics, которая была единственной в Qt3, если не ошибаюсь. Потом сделали Model-View как более фундаментальную и функциональную фичу, а Item-based натянули поверх (типо для тех, кто "привык").

Majestio +1.

В более/менее функциональных прогах:
Data
Business Logic (C++ classes, ORM)
QAbstractItemModel-наследник: манипуляция данными через Business Logic
View для представления


Название: Re: QTableWidget vs QTableView (холиварчик)
Отправлено: GreatSnake от Август 05, 2013, 14:55
по идее *Widget потребляет больше памяти, чем *View, особенно разница будет заметна на больших объемах данных
Всё зависит от используемой модели.
Если использовать *View и QStandardItemModel, то, имхо, разница будет минимальной.


Название: Re: QTableWidget vs QTableView (холиварчик)
Отправлено: Bepec от Август 05, 2013, 17:10
Widget это view со стандартной моделью и с максимально расширенным функционалом. Кто не верит - прошу в ассистент.

Комментарий Akon уходит в небытие - это не пережиток Qt3, а удобное и быстрое решение для простых решений.

to GreatSnake - разница будет. Там много функционала. А своя моделька голая.


Название: Re: QTableWidget vs QTableView (холиварчик)
Отправлено: GreatSnake от Август 05, 2013, 17:17
Widget это view со стандартной моделью и с максимально расширенным функционалом. Кто не верит - прошу в ассистент.
Что имеется в виду под "стандартной моделью"?
Если QStandardItemModel, то утверждение неверное, ибо
для QListWidget используется приватная QListModel,
для QTreeWidget используется приватная QTreeModel,
для QTableWidget используется приватная QTableModel

Цитировать
to GreatSnake - разница будет. Там много функционала. А своя моделька голая.
чего-то не понял про какую разницу идёт речь ???


Название: Re: QTableWidget vs QTableView (холиварчик)
Отправлено: Bepec от Август 05, 2013, 18:10
Сужу по Qt 4.7.2 и документации на 5.1

QListWidget и прочие Widget являют собой список Q*WidgetItems. Т.е. каждый элемент представляется отдельно. Отдельно для каждого выделяется место под роли/текст/данные/шрифт/ прочие атрибуты, которые возможно пригодятся (именно это я имею в виду как широкий функционал).

Т.е. QListWidget/QTableWidget/QTreeWidget являют собой просто совокупности QListWidgetItem/QTableWidgetItem/QTreeWidgetItem. Занимаемое место растёт линейно количеству элементов и их атрибутов.

Свой же View и модель дают совокупность данных и единые атрибуты для всех элементов (метод data). При желании оно может конечно разбухнуть, но врят-ли до таких размеров, как *Widget.

Сейчас Widget пример докачает миллион элементов в память и я выложу реальные цифры. А пока жду :)


Update: Предупреждение, картинка на 500 кб.
Обе программы содержат миллион строк "tratata". Разница только в Widget/View и процессе заполнения.
Разница в 3 раза по памяти. 

PS это не плохо. Это нормально. На малых объемах данных мне лично удобнее использовать Widget не продумывая модель и роли. К тому же такое поведение можно менять в любой момент и в любом месте ^.^


Название: Re: QTableWidget vs QTableView (холиварчик)
Отправлено: kambala от Август 05, 2013, 18:57
по идее *Widget потребляет больше памяти, чем *View, особенно разница будет заметна на больших объемах данных
Всё зависит от используемой модели.
Если использовать *View и QStandardItemModel, то, имхо, разница будет минимальной.
как-то ни разу еще не пользовался этой моделью (всегда или абстрактной или виджетом). как раз хочу перевести одно приложение с QTableWidget (при 2 таблицах из 2 колонок и 10.5к строк каждая программа ест 35 МБ) на Model/View — вот и попробую её :)


Название: Re: QTableWidget vs QTableView (холиварчик)
Отправлено: Bepec от Август 05, 2013, 19:27
Боюсь вас разочаровать, но судя по исходникам Q*Widget используют как раз её :P

Она ж так и называется - Item. Т.е. каждая строка/объект будет отдельной сущностью со всей функциональностью (роли, цвет и прочая). Разница будет минимальной :)

PS хотя попробуйте, мне тож интересно стало ;)


Название: Re: QTableWidget vs QTableView (холиварчик)
Отправлено: kambala от Август 05, 2013, 19:30
Боюсь вас разочаровать, но судя по исходникам Q*Widget используют как раз её :P
нет, не ее: class QTableModel : public QAbstractTableModel


Название: Re: QTableWidget vs QTableView (холиварчик)
Отправлено: Bepec от Август 05, 2013, 19:43
Её?
Цитировать
AbstractTableModel Class Reference
The QAbstractTableModel class provides an abstract model that can be subclassed to create table models. More...
 #include <QAbstractTableModel>
Inherits QAbstractItemModel.
Inherited by QSqlQueryModel.

Я вас не отговариваю :) О результатах отпишитесь ;)


Название: Re: QTableWidget vs QTableView (холиварчик)
Отправлено: kambala от Август 05, 2013, 20:18
GreatSnake говорил о QStandardItemModel, будь внимательнее


Название: Re: QTableWidget vs QTableView (холиварчик)
Отправлено: Bepec от Август 05, 2013, 20:26
Кхм. Я наверно неверно или неясно выражаюсь ) Все стандартные модели её используют, повторюсь :D Все что на Widget кончаются - они её и используют :P


Название: Re: QTableWidget vs QTableView (холиварчик)
Отправлено: kambala от Август 05, 2013, 20:34
кажется ты что-то путаешь:
Widget это view со стандартной моделью и с максимально расширенным функционалом. Кто не верит - прошу в ассистент.
Что имеется в виду под "стандартной моделью"?
Если QStandardItemModel, то утверждение неверное, ибо
для QListWidget используется приватная QListModel,
для QTreeWidget используется приватная QTreeModel,
для QTableWidget используется приватная QTableModel
Боюсь вас разочаровать, но судя по исходникам Q*Widget используют как раз её :P
нет, не ее: class QTableModel : public QAbstractTableModel
GreatSnake говорил о QStandardItemModel, будь внимательнее
и финал: class QStandardItemModel : public QAbstractItemModel


Название: Re: QTableWidget vs QTableView (холиварчик)
Отправлено: Bepec от Август 05, 2013, 20:44
ну как знать) я велосипед ремонтирую, занят. Сорри ;)

PS хотя подождите) С какого я неправ? Они используют все его потомков :P Т.е. я прав :D