![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
JohnZ |
![]()
Сообщение
#1
|
Участник ![]() ![]() Группа: Участник Сообщений: 139 Регистрация: 19.7.2014 Пользователь №: 4190 Спасибо сказали: 10 раз(а) Репутация: ![]() ![]() ![]() |
Здравия Всем !
Понадобился мне в проект QDataTable, из QT3, а тянуть ВЕСЬ модуль Qt3Support4.dll не хочется. QTable из 4-ки более похож на M$ Exel, и для справочников не совсем то что мне нужно ... Может кто уже занимался этим вопросом, поделитесь плз. Буду оч-чень благодарен ! |
|
|
![]() |
lanz |
![]()
Сообщение
#2
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Нарисуйте как должно выглядеть то что вам нужно, прикинем как настроить QTableView чтобы выглядел так же.
|
|
|
JohnZ |
![]()
Сообщение
#3
|
Участник ![]() ![]() Группа: Участник Сообщений: 139 Регистрация: 19.7.2014 Пользователь №: 4190 Спасибо сказали: 10 раз(а) Репутация: ![]() ![]() ![]() |
Нарисуйте как должно выглядеть то что вам нужно, прикинем как настроить QTableView чтобы выглядел так же. Вид в прицепе, но видимо тут нужны некоторые пояснения с моей стороны, почему нужно именно так, а не иначе ... Работаю над проектом типа "Ананас", если кто в курсе что это за проект. В 3-й версии ребята потрудились на славу, молодцы, но вот при переходе на 4-ю версию, вынуждены были потянуть Qt3Support4.dll, т.к. слишком много в проекте "завязано" на Qt3 ... Не знаю почему в точности, (отладчик "сваливается" в ассемблерный код dll) но IMHO по этой причине под виндой он глючный до безобразия, и собирается с "бубном", т.к. недоработан import/export функций в т.ч. В линухе это сделано "автоматом", а в винде нет, как я вычитал на этом форуме ... Кроме того видимо сказывается разность версий Qt, - Ананас4 собирался с 4.1.5, а я собираю с 4.5.3. Это видимо тоже одна из причин "сваливания" встроенного Дизайнера диалогов Qt4. Его тоже придётся переделывать ... ![]() собирать с 4.6.1 - вылетает почти сразу, после запуска Дизайнера диалогов ... Прошу прощения за длинную тираду, а теперь по-делу ... QDataTable должен будет показывать справочники (и документы видимо тоже), быть плагином в Дизайнере диалогов и предоставлять интерфейсы для QSA (Qt-Script убрал из проекта и вернул QSA-1.2.3, т.к. IMHO он "шустрее". Мне удалось его собрать под 4.5.3. В оригинале есть 2 ошибки, если кому надо ...), а QTableView я планирую на показ табличных отчётов. Должны-же быть какие-то отличия ... ![]()
Эскизы прикрепленных изображений
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#4
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Визуально я не вижу отличий от QTableView (Qt4).
Можешь использовать QTableWidget (Qt4), монолитный класс по аналогии с QDataTable (Qt3) |
|
|
lanz |
![]()
Сообщение
#5
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Если нужно все связать, можно сделать свой виджет с QTableView и встроенной QSqlTableModel например. Оформить его как плагин, сделать QSA интерфейс.
Кстати, насчет того что QSA шустрее, есть какие нибудь бенчмарки? |
|
|
JohnZ |
![]()
Сообщение
#6
|
Участник ![]() ![]() Группа: Участник Сообщений: 139 Регистрация: 19.7.2014 Пользователь №: 4190 Спасибо сказали: 10 раз(а) Репутация: ![]() ![]() ![]() |
Юрий, БлагоДарю. Попробую, но пока не очень получается настроить, т.к. некоторые св-ва в Дизайнере
этого элемента для меня пока не совсем понятны ... И ещё, пока есть одна проблема, - для QTableWidget метод setmodel() из QTableView закрыт, а QTableView не настраивается как QTableWidget ... Если нужно все связать, можно сделать свой виджет с QTableView и встроенной QSqlTableModel например. Оформить его как плагин, сделать QSA интерфейс. Именно так мне и нужно. Скорее всего сделаю шаблоны форм *.ui (Справочник, Документ, ...), с настроенным заранее QTableWidget, как подсказал Юрий, и положу их в ресурсы приложения. Ну и + (универсальный) класс, это всё хозяйство обслуживающий ... Вернее 2 класа, для Дизайнера Арр и Исполнителя ... Кстати, насчет того что QSA шустрее, есть какие нибудь бенчмарки? Дык заглянув в исходники QSA и Qt Script, хотя-бы поверхностно можно оценить выполняемый объём работы одним и вторым интерТреПатором по разбору и выполнению кода жабьего скрипта. На мощной технике это видимо будет мало заметно, а вот на "слабых" машинках, и при десятке-втором тыс. записей в БД, это уже будет заметно, IMHO. Я не имею в виду выборку/фильтрацию SQL-ем, а обработку записей именно скриптом, как в отчётах, например. Ведь заранее не известно, для каких целей будет этот скрипт применён ... Справедливости ради, могу добавить, что спрашивал я у Макса Шлее о "возвращении" QSA, дык он рекомендовал не делать этого. Но я пока остался при своём мнении. Попробую, буду знать точно, но до этого пока ещё далеко ... |
|
|
lanz |
![]()
Сообщение
#7
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Попробую, но пока не очень получается настроить, т.к. некоторые св-ва в Дизайнере этого элемента для меня пока не совсем понятны ... Спрашивайте какие, на той картинке что вы привели выглядит как QTableView по умолчанию. Цитата И ещё, пока есть одна проблема, - для QTableWidget метод setmodel() из QTableView закрыт, а QTableView не настраивается как QTableWidget ... Потому что в QTableWidget своя модель. Что вы имеете в виду, когда говорите не настраивается? Какие параметры не настраиваются? |
|
|
JohnZ |
![]()
Сообщение
#8
|
Участник ![]() ![]() Группа: Участник Сообщений: 139 Регистрация: 19.7.2014 Пользователь №: 4190 Спасибо сказали: 10 раз(а) Репутация: ![]() ![]() ![]() |
Имелось в виду то, что в QT Дизайнере задать заранее колонки для QTableView нельзя (нет там такого диалога его настройки
как элемента диалога, т.е. формы Справочник, Документ, ...), а у QTableWidget такой диалог есть. Вызывается двойным щелчком на элементе. Например, в справочнике 5 полей, показать нужно 3. Для QTableWidget в QT Дизайнере это настроить можно, а так-же добавить ему дин-е св-ва и задать им значения, а как для QTableView это сделать, я не нашёл. (QT 4.5.3) Я понимаю что QTableView заточен для модель\представления, но дело в том, что заранее не известно, сколько полей будет в таблице, и какие из них и в каком порядке будут в просмотре. Именно для этого и нужен родной QT Дизайнер. |
|
|
lanz |
![]()
Сообщение
#9
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Число полей, а так же их порядок и названия зависят от модели, у нее для этого нужно переопределить методы
columnCount, headerData и т.п. Почитайте вот это: http://qt-project.org/doc/qt-4.8/model-view-programming.html В свою очередь эти методы могут выдавать разные значения динамически. Т.е. вам не нужно несколько View для разных типов таблиц, а нужно несколько моделей(например). Или одна модель которая настраивается через дизайнер. Вот здесь описано как сделать модель со своими свойствами: http://qt-project.org/doc/qt-4.8/designer-...om-widgets.html |
|
|
JohnZ |
![]()
Сообщение
#10
|
Участник ![]() ![]() Группа: Участник Сообщений: 139 Регистрация: 19.7.2014 Пользователь №: 4190 Спасибо сказали: 10 раз(а) Репутация: ![]() ![]() ![]() |
Число полей, а так же их порядок и названия зависят от модели, у нее для этого нужно переопределить методы columnCount, headerData и т.п. Почитайте вот это: http://qt-project.org/doc/qt-4.8/model-view-programming.html Я имел в виду динамический BIND полей, как в формах 1С или Ананасе. В свою очередь эти методы могут выдавать разные значения динамически. Т.е. вам не нужно несколько View для разных типов таблиц, а нужно несколько моделей(например). Или одна модель которая настраивается через дизайнер. Вот здесь описано как сделать модель со своими свойствами: http://qt-project.org/doc/qt-4.8/designer-...om-widgets.html Именно так, одна (универсальная) модель которая настраивается через дизайнер(ы) ! Виджеты дизайнера "родные", и мне пока нет необходимости создавать свои, нужно лишь к имеющимся добавить необходимые динамические свойства для BIND-а, например ID поля и его номер колонки в view. |
|
|
lanz |
![]()
Сообщение
#11
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Я имел в виду динамический BIND полей, как в формах 1С или Ананасе. Через модель как раз и можно сделать динамический бинд. Для биндинга от модели до виджетов есть QDataWidgetMapper http://qt-project.org/doc/qt-5/QDataWidgetMapper.html Вот смотрите, создаете свой кастомный виджет, добавляете ему свойство например ColumnName. Потом в модели доступаетесь до этого свойства и через data выдаете нужные колонки. Если нужно в таблицу - делаете setModel для QTableView, на виджеты биндить через QDataWidgetMapper и т.п. Виджеты дизайнера "родные", и мне пока нет необходимости создавать свои, нужно лишь к имеющимся добавить необходимые динамические свойства для BIND-а, например ID поля и его номер колонки в view. Если вы хотите прямо через дизайнер настраивать (а не через xml конфиг например), то придется свой виджет сделать. Но ничего особо сложного или плохого не вижу в этом. |
|
|
JohnZ |
![]()
Сообщение
#12
|
Участник ![]() ![]() Группа: Участник Сообщений: 139 Регистрация: 19.7.2014 Пользователь №: 4190 Спасибо сказали: 10 раз(а) Репутация: ![]() ![]() ![]() |
Я имел в виду динамический BIND полей, как в формах 1С или Ананасе. Через модель как раз и можно сделать динамический бинд. Для биндинга от модели до виджетов есть QDataWidgetMapper http://qt-project.org/doc/qt-5/QDataWidgetMapper.html Вот смотрите, создаете свой кастомный виджет, добавляете ему свойство например ColumnName. Потом в модели доступаетесь до этого свойства и через data выдаете нужные колонки. Если нужно в таблицу - делаете setModel для QTableView, на виджеты биндить через QDataWidgetMapper и т.п. Я до этого пока ещё не "дошёл", - БлагоДарю ! Про этот класс я не знал ... Ес-сно это не должно быть в убыток скорости выполнения создаваемого конфига проекта в Исполнителе, в расчёте на несколько млн записей в БД. В 1С есть такая болезнь, загибается она на больших БД, и есть у меня подозрение, что именно на этом самом BIND-е и Mapper-е в т.ч. ... Виджеты дизайнера "родные", и мне пока нет необходимости создавать свои, нужно лишь к имеющимся добавить необходимые динамические свойства для BIND-а, например ID поля и его номер колонки в view. Если вы хотите прямо через дизайнер настраивать (а не через xml конфиг например), то придется свой виджет сделать. Но ничего особо сложного или плохого не вижу в этом. Не, видимо мы друг-друга не поняли. Весь конфиг проекта лежит в xml, в этом вся фишка. Гляньте проект Ананас. Если не найдёте, пример его конфига могу кинуть на мыло. Там всё вместе, диалоги, скрипты, структура БД, и т.д. XML-й ui файл являе(ю)тся DomElement-ом XML всего проекта. Думаю, так будет понятней ... |
|
|
Litkevich Yuriy |
![]()
Сообщение
#13
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
в QT Дизайнере задать заранее колонки для QTableView нельзя потому что их нет, это представление данных расположенных в модели. Сколько модель скажет, столько представление и нарисует колонок.но дело в том, что заранее не известно, сколько полей будет втаблице, и какие из них и в каком порядке будут в просмотре. Именно для этого и нужен родной QT Дизайнер. Как бы ты решал эту проблему в Qt3?
|
|
|
JohnZ |
![]()
Сообщение
#14
|
Участник ![]() ![]() Группа: Участник Сообщений: 139 Регистрация: 19.7.2014 Пользователь №: 4190 Спасибо сказали: 10 раз(а) Репутация: ![]() ![]() ![]() |
Как бы ты решал эту проблему в Qt3? ... тут помошник нужен, хомосапиенс ![]() По-дедОвски ![]() плюс к этому к колонкам добавляется 1 или 2 динам-е свойства, - Id и формат (опционально). Пишем специализированный класс, который в курсе что на форме лежит именно QDataTable с доп. свойствами в колонках, и через себя связывает(настраивает) его с полем(и) БД по реальному имени поля в БД. Это как в 3-м Дизайнере положить на форму QDataTable, дать ему коннект к БД и запустить на предпросмотр. Он сразу-же и покажет таблицу, в предпросмотре. Причём показывает без тормозов, даже большие таблицы. Т.е. для решения этой проблемы в 3-ке, нужно было-бы симитировать настройку QDataTable егойным Дизайнером. Может подскажешь для 4-ки более изящное решение ? PS: А как тут свои месаги править ? Или низ-зя ? ![]() |
|
|
Litkevich Yuriy |
![]()
Сообщение
#15
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
JohnZ, два твоих сообщения, процитированные мною, противоречат друг другу.
Твою задачу всё же лучше решать с помощью модель-представление. Использую QSqlTableModel и QTableView. В дизайнере, кроме размещения представления в окне программы, ничего настраивать не нужно - бросил видджет в компоновщик и всё. В коде настрой модель, свяжи с ней представление. ... тут помошник нужен, хомосапиенс (А из какого это фильма ?) "Формула любви", Марка ЗахароваPS: А как тут свои месаги править ? Или низ-зя ? наберёшь двадцать сообщений вне раздела "Курилка", появится такая возможность (такая защита от спамеров и трепачей)
|
|
|
JohnZ |
![]()
Сообщение
#16
|
Участник ![]() ![]() Группа: Участник Сообщений: 139 Регистрация: 19.7.2014 Пользователь №: 4190 Спасибо сказали: 10 раз(а) Репутация: ![]() ![]() ![]() |
Твою задачу всё же лучше решать с помощью модель-представление. Использую QSqlTableModel и QTableView. В дизайнере, кроме размещения представления в окне программы, ничего настраивать не нужно - бросил видджет в компоновщик и всё. Дык это в коде, а мне нужно в XML-е. (конфиг XML-й. Это как конфиг в 1С или Ананасе) Если нужен примерчик, - могу выложить. Пример из QT 4.5 simpledommodel (или любой другой) показывает весь состав бизнес-логики ... В коде настрой модель, свяжи с ней представление. Видимо речь идёт о специализированном классе, о котором писал выше lanz, а затем и я ? Если да, то как-раз над ним сейчас ломаю моСк ... ![]() Цитата(JohnZ @ 3.8.2014, 20:06) * ... тут помошник нужен, хомосапиенс (А из какого это фильма ?) "Формула любви", Марка Захарова Я когда уже отправил мессагу, то вспомнил этот фильм, - это когда мужик карету разобрал ![]() Но "почистить" пост уже не мог ... |
|
|
JohnZ |
![]()
Сообщение
#17
|
Участник ![]() ![]() Группа: Участник Сообщений: 139 Регистрация: 19.7.2014 Пользователь №: 4190 Спасибо сказали: 10 раз(а) Репутация: ![]() ![]() ![]() |
Обозначенный виджет вроде-бы реализовал, как и сказал Юрий, на QTableView.
Он действительно смог настроится как QDataTable из QT3, но вотЪ поменять местами колонки, пока у меня проблема. Для QDataTable это можно было делать в Дизайнере визуально, мышой. Тут так пока не получается ... ![]() Теперь вторая проблема - нужен, опять-же из QT3 ![]() реализованной моделью. Т.е. по кнопке Enter нужно в диалоге показать выбранную запись в аналоге QDataBrowser. Вопросы: 1. Как идентифицировать выбранную запись в QTableView ? Имеется в виду аналог для QComboBox::addItem(aStr, Idd), а затем достать Idd из QComboBox::itemData ( ui.cb->currentIndex(), int role = Qt::UserRole ) и определить выбор. Как в модель QTableView вставить этот Idd и затем достать, для идентификации записи по ключу ? 2. Если Idd в записи будет НЕ первой, и/или первичный ключ составной ? Это в том смысле, что пример QT со спрятанной колонкой не совсем подходит ... 3. Поскольку в модели для QTableView могут показываются не все колонки, т.к. удалены из неё ( model.removeColumn(i); ) для формы диалога редактирования записи ( QDataBrowser ) придётся видимо создавать модель по-новой и пере-считывать запись ? Из имеющейся модели вытащить ВСЕ колонки для редактирования уже не получится ? Или можно ? |
|
|
lanz |
![]()
Сообщение
#18
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
1. QTableView::currentIndex/selectionModel()->selectedIndexes()
По индексу можно уже из модели получать все что угодно. Т.к. вы реализуете модель, то можно переопределить метод data, чтобы он по нужной роли выдавал то что надо. Поменять колонки местами можно через QTableView::horizontalHeader()->moveSection(x, y); 2. Тут не совсем понял. У вас есть модель, которая отражает все записи, то в каком порядке вы ее отображаете, и как, это уже зависит от View и Proxy моделей. Поэтому в принципе все равно, как данные представлены в модели. 3. Удалять колонки не стоит. Есть QTableView::hideColumn. Тогда все колонки останутся. |
|
|
JohnZ |
![]()
Сообщение
#19
|
Участник ![]() ![]() Группа: Участник Сообщений: 139 Регистрация: 19.7.2014 Пользователь №: 4190 Спасибо сказали: 10 раз(а) Репутация: ![]() ![]() ![]() |
lanz, БлагоДарю.
1. Метод data у меня пока отсутствует, т.к. используется стандартная QSqlTableModel. Сделать так ( +data ) пока архитектурно не получается... ![]() 2. Тут проблема в том, что Proxy пока не реализован. Провозился я с ним в DomModel, не заработал он как надо (видимо по незнанию), поэтому здесь тоже ... lanz, - если Вам на мыло скинуть мин. проэкт, с Proxy (DomModel + QTreeView) сможете помочь ? 3. Вчера почти день угрохал на QTableView::hideColumn, отказывается он прятать колонки ![]() QTableView *view; ........................................ view->hideColumn(...); Может это из-за того, что он загружен и создан динамически с ui-файла ? Такое впечатление, что hideColumn(i) в либе - пустышка, но при этом view->removeColumn(i) как ни странно работает безотказно. Сообщение отредактировал JohnZ - 2.10.2014, 11:28 |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 30.5.2025, 16:20 |