LINUX.ORG.RU

Методология программирования на Qt


0

0

Нужно на Qt написать простенькое "бизнес-приложение" (точнее - быдлоформочка связанная с БД :) ). Почитал Бланшет/Саммерфилд, авторы в конструктор "формы" запихивают объект класса QSqlTableModel, определяют его свойства (таблицу, поля, условия выборки) и связывают с QTableView. Мне это напомнило тяжёлое университетское детство и Delphi. Разве что компоненты не мышой таскаем, а создаем в конструкторе. В связи с этим, вопросы:

0) Как можно не смешивать модель и представление? Наследовать свой класс от QSqlTableModel, всю логику модели определять в нем и подсовывать QTableView в качестве источника данных?

1) "Ручное" (через sql-запросы) вытягивание данных с БД, инициализация ими списков объектов, использование итераторов для проходов по этих списках и т.д. - это прошлый век? Лучше использовать model/view, встроенный в Qt?

В Qt и "бизнес-программировании" нуб, посему сильно не пинайте. Спасибо.

anonymous

Re: Методология программирования на Qt

IMHO - не париться, и писать как можно проще. При необходимости - переписывать, вводить паттерны, новые слои, но только при необходимости. Собственно, имхо, умение видеть грань между простым кодом, и bloated кодом, и перерабатывать его, когда надо, и есть одна из составляющих профессионализма. А всякие комплексы, связанные с дельфями, лучше забыть.

Legioner ★★★★★ ()
Ответ на: Re: Методология программирования на Qt от Legioner

Re: Методология программирования на Qt

>IMHO - не париться, и писать как можно проще. При необходимости - переписывать, вводить паттерны, новые слои, но только при необходимости.

Ну скажем для моей программки на 3 таблицы, этот совет подойдет. Но если таблиц/форм штук 100?

anonymous ()

Re: Методология программирования на Qt

> 1) "Ручное" (через sql-запросы) вытягивание данных с БД, инициализация ими списков объектов, использование итераторов для проходов по этих списках и т.д. - это прошлый век? Лучше использовать model/view, встроенный в Qt?

Лучше использовать model/view. Но это не спасёт от того, что при создании QSqlQueryModel придётся указывать запрос :)

gaa ★★ ()

Re: Методология программирования на Qt

> 0) Как можно не смешивать модель и представление? Наследовать свой класс от QSqlTableModel, всю логику модели определять в нем и подсовывать QTableView в качестве источника данных?

Вынести запросы в отдельный файл, потом задавать их параметрами для QSqlQueryModel, который отображать на QTableView. А вот QTableView стоит унаследовать и дать ему функциональность, которая будет отвечать за действия с конкретными строками таблицы(открытие окна редактирования записи по даблклику и т.д.).

gaa ★★ ()

Re: Методология программирования на Qt

>при создании QSqlQueryModel придётся указывать запрос

Ну я не боюсь sql :) Вопрос в другом.

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

Qt же, насколько я понял, предлагает взять всю черновую работу на себя, а мне нужно лишь создать один класс-наследник и указать ему, откуда брать данные и кому отдавать. Слишком просто :) Вот и хочу выяснить, где зарыта собака.

З.Ы. Ну и такая схема имхо не будет работать на сложных условиях выборки.

anonymous ()
Ответ на: Re: Методология программирования на Qt от anonymous

Re: Методология программирования на Qt

> Qt же, насколько я понял, предлагает взять всю черновую работу на себя, а мне нужно лишь создать один класс-наследник и указать ему, откуда брать данные и кому отдавать. Слишком просто :) Вот и хочу выяснить, где зарыта собака.

Я Вас не понимаю. Класс QSqlQueryModel предоставляет работу с результатами запроса в виде таблицы. Запрос может быть любым, с любым количеством where, join и прочих конструкций sql-я.

Если надо получать данные из базы последовательно -- используйте QSqlQuery и забирайте из него по очереди. Пример:

QSqlQuery query("",QSqlDatabase::database("ems"));
if (m_id.isNull()) {
query.prepare("select id from employee where (manager is null)");
} else {
query.prepare("select id from employee where (manager=:id)");
query.bindValue(":id",m_id);
}
query.exec();

while (query.next()) {
ReportingTreeItem *ch=new ReportingTreeItem(query.value(0),this);
ch->setRow(appendChild(ch));
}

gaa ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.