2013-03-20 6 views
3

Я хочу создать программное обеспечение, которое будет просматривать некоторые таблицы базы данных, и пользователи смогут редактировать эти таблицы. После моего чтения этого link я решила, что модель/представление было хорошим подходом к тому, что мне нужно. Посмотрите следующий макет: enter image description hereОсновная концепция модели Qt/view и QTableView

Зная это, у меня есть вопросы, чтобы быть уверенным, что я понимаю концепцию. Пожалуйста, сообщите мне, если я нахожусь в хорошем направлении:

  1. Я думаю, мне нужно создать класс модели для каждой из моих таблиц? (подклассификация QAbstractModel). Он будет выглядеть следующим образом:

    class citiesTableModel : public QAbstractItemModel 
    { 
        Q_OBJECT 
    } 
    
  2. citiesTableModel конструктор будет получать данные из таблицы в базе данных?

    QAbstractItemModel *model = new citiesTableModel(); //model will contain 2 rows, New York and Seattle 
    
  3. Мне нужно создать подкласс QTableView для каждой другой модели делать?

    class citiesTableView : public QTableView{} 
    
  4. Finnaly, я предполагаю, что view.setData и view.setModel должны быть переписана? setModel будет циклически перемещаться по каждой строке модели, чтобы построить QTableView , а setData выполнит правильный запрос для добавления новых данных в модель ?

спасибо.

ответ

1

Вы можете использовать QSqlTableModel для этого.

Как говорит доктор, он может быть использован довольно легко:

QSqlTableModel *model = new QSqlTableModel(parentObject, database); 
model->setTable("employee"); 
model->setEditStrategy(QSqlTableModel::OnManualSubmit); 
model->select(); 
model->setHeaderData(0, Qt::Horizontal, tr("Name")); 
model->setHeaderData(1, Qt::Horizontal, tr("Salary")); 

QTableView *view = new QTableView; 
view->setModel(model); 
view->hideColumn(0); // don't show the ID 
view->show(); 

Я думаю, мне нужно создать класс модели для каждой таблицы?

Да, одна модель представляет собой один стол sql.

citiesTableModel constructor будет извлекать данные из таблицы в базе данных?

QSqlTableModel сделает это за вас:

QSqlTableModel *model = new QSqlTableModel(parentObject, database); 
model->setTable("employee"); 
model->select(); 

Мне нужно создать подкласс QTableView для каждой другой модели делать?

Нет, вы этого не сделаете. Один QTableview может отображать любую модель, которую вы установили, используя setModel.

Finnaly, я думаю, что view.setData и view.setModel должен быть reimplemented? setModel будет циклически перемещаться по каждой строке модели, чтобы построить QTableView , а setData выполнит правильный запрос для добавления новых данных в модель ?

В зависимости от стратегии редактирования задается с помощью setEditStrategy, изменения будут поручены как ваше редактирование ячейки таблицы, или после того, как вы отправили их с помощью submitAll.

Также вы можете взглянуть на QDataWidgetMapper. Он может отображать ваши данные модели в разные виджеты и отслеживать изменения, которые вы делаете, редактируя эти виджеты.

+0

Thx для вашего ответа. На самом деле это выглядит немного легче, чем я. Вопрос: Наша база данных - postgreSQL. Вы знаете, работает ли QSqlTableModel с этой базой данных? Кроме того, для стратегии редактирования на самом деле не может быть изменено через tableview, только с формой (ниже tableview). Делает ли это еще проще? Finnaly, вы уверены, что мне не нужно подклассифицировать QTableView? Если я хочу конвертировать boolean в checkbox? Thx – peterphonic

+1

Да, он может работать с любой базой данных, если у вас есть подходящий плагин qt sql. Да, можно редактировать данные через таблицу. Чтобы отображать логические значения как флажки, вы должны использовать [делегировать классы] (http://qt-project.org/doc/qt-4.8/model-view-programming.html#delegate-classes). – hank

+0

Thx снова для вашего ответа. Что-то, что я был недостаточно ясен. На самом деле это дизайнерское решение. Что мы хотим: пользователь не сможет редактировать представление таблицы непосредственно. Пользователь должен будет сначала выбрать строку, и форма будет заполнена соответствующим образом, и пользователь изменит форму. – peterphonic

3

В основном у вас есть различные варианты:

Либо база данных представляет собой базу данных SQL. Вы можете использовать подкласс QSqlTableModel. В противном случае, если вы хотите создать свою модель с нуля, вы делаете свою собственную модель, но я не вижу смысла. У вас также есть QTableModel.

Вам не нужно создавать модель для каждой из ваших таблиц, потому что она всегда является табличной моделью. Модель в основном определяет, как вы можете добавлять и удалять строки с вашими конкретными данными.

Что касается представления, вам нужно наследовать QTableView, чтобы добавить настраиваемое поведение для строк и колонок, например, например, для перетаскивания.

Единственный элемент настройки, который вам нужен, является делегатом для вашего представления или просто для столбца. Он в основном преобразует логическое значение в вашей модели в флажок.

Предлагаю вам посмотреть на SpinBox delegate для большей точности.

Надеюсь, это поможет.

Edit:

В случае PostgreSQL вы можете добавить его в QSqlDatabase:

QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL"); 
db.setHostName("acidalia"); 
db.setDatabaseName("customdb"); 
db.setUserName("mojito"); 
db.setPassword("J0a1m8"); 
bool ok = db.open(); 

Затем передать дб на QSqlTableModel.Если вам нужно больше реляционные операции, такие как Fetching полей из внешнего ключа, вы можете использовать:

QSqlRelationalTableModel 
QSqlRelationalDelegate 
+0

Работает ли QSqlTableModel с базой данных postgreSQL? Спасибо! – peterphonic

+1

Да, любая база данных, работающая с QSqldatabase. – Kikohs