crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Как использовать <QAbstractTableModel>
Lonely_hermit
  опции профиля:
сообщение 3.4.2010, 10:10
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 3.4.2010
Пользователь №: 1590

Спасибо сказали: 0 раз(а)




Репутация:   0  


Дорогие форумчане.

Как задавать в *.h и *.cpp модель при помощи класса <QAbstractTableModel>, с учётом того, что она обращается к "таблице" в базе POSTGre' и служит для передачи данных в TableView?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 3.4.2010, 10:29
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Lonely_hermit @ 3.4.2010, 14:10) *
QAbstractTableModel
этот класс не предназначен для создания экземпляров (объектов), а только для наследования. Об этом говорит слово "Абстрактный" в названии этого класса.

Примеры по работе с Модель/представление есть в поставке Qt:
Программирование Модель/Представление
Cached Table Example
Table Model Example
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Lonely_hermit
  опции профиля:
сообщение 3.4.2010, 14:04
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 3.4.2010
Пользователь №: 1590

Спасибо сказали: 0 раз(а)




Репутация:   0  


Я не совсем корректно выразился.
У меня есть физическая модель QSqlQueryModel *mod;
Есть также QSortFilterProxyModel pm, по которой происходит сортировка строк в порядке возрастания.
Индексы эту pm НЕ видят, они видят только mod. Как сделать так, чтобы таблица в mod была отсортирована как и pm?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 3.4.2010, 15:23
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Lonely_hermit @ 3.4.2010, 18:04) *
Индексы эту pm НЕ видят, они видят только mod. Как сделать так, чтобы таблица в mod была отсортирована как и pm?
что-то я вообще ничего не понял. Приведи код того, что ты пытаешься сделать
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Lonely_hermit
  опции профиля:
сообщение 3.4.2010, 19:54
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 3.4.2010
Пользователь №: 1590

Спасибо сказали: 0 раз(а)




Репутация:   0  


Заранее прошу прощения за русский. Вся программа делалась в Linuxe.
*.h Parent Form.
___________________________________________
Раскрывающийся текст

namespace Ui
{
    class query1;
}

class query1 : public QMainWindow
{
    Q_OBJECT

public:
    query1(QTableView *parent = 0);
    ~query1();

QSqlQueryModel *mainmodel() const
{
     return mod;
}
protected:
Ui::query1 *r_ui;
QSqlQueryModel *mod;
QString squr;
QSqlDatabase gb;

private slots:
  void on_EXIT_clicked();
  void on_Add_clicked();
  void on_Change_clicked();
  void on_Delete_clicked();
};



*.cpp Parent Form.
___________________________________________
Раскрывающийся текст

query1::query1(QTableView *parent) :
   QMainWindow(parent), r_ui(new Ui::query1)
{
r_ui->setupUi(this);
r_ui->menuBar->addAction(r_ui->action);
connect(r_ui->action, SIGNAL(triggered()), this, SLOT(close()));
gb = QSqlDatabase::addDatabase("QPSQL", "");
gb.setDatabaseName("");
gb.setHostName("");
gb.setPassword("");
gb.setUserName("");
gb.open();
  
mod = new QSqlQueryModel();

  
mod->setQuery("select * from \"example\".addressbook", gb);
mod->setHeaderData(0, Qt::Horizontal,QObject::tr("No \nУПФТ."));
mod->setHeaderData(1, Qt::Horizontal, QObject::tr("жйп"));
mod->setHeaderData(2, Qt::Horizontal, QObject::tr("лПОФБЛФОЩК \nФЕМЕЖПО"));
mod->setHeaderData(3, Qt::Horizontal, QObject::tr("E-РПЮФБ:"));
r_ui->myTable->setColumnWidth(0, 60);
r_ui->myTable->setColumnWidth(1, 150);
r_ui->myTable->setColumnWidth(2, 150);
r_ui->myTable->setColumnWidth(3, 150);
r_ui->myTable->setGridStyle(Qt::DotLine);



if (!gb.open())
{
    QMessageBox::critical( parent, QObject::tr("DataBase Error!"), gb.lastError().text());
    return;
}

QSortFilterProxyModel *pm;
pm->setSourceModel(mainmodel());
pm->setFilterKeyColumn(0);
pm->sort(0, Qt::AscendingOrder);

r_ui->myTable->setModel(pm);

}

//Есть две кнопки, обращающиеся к Child Form.
//C индексами проблема.

void query1::on_Delete_clicked()
{
QString sselect;
QString snotd;
//ПРТЕДЕМСЕН ЙОДЕЛУ ФЕЛХЭЕК ЪБРЙУЙ ОБ DBGrid

QModelIndex index = r_ui->myTable->currentIndex(); //ЪДЕУШ tableView ЙНС DBGrid ОБ ЖПТНЕ
if (!index.isValid())
{
QMessageBox::warning(this, tr("рТЕДХРТЕЦДЕОЙЕ"),QObject::tr("дБООЩЕ ОЕ ЧЩВТБОЩ"));
return;
}
QMessageBox msgBox;
msgBox.setIcon(QMessageBox::Question);
msgBox.setWindowTitle(tr("рПДФЧЕТДЙФЕ ХДБМЕОЙЕ ЪБРЙУЙ"));
msgBox.setText(tr("хДБМЙФШ ЪБРЙУШ?"));
msgBox.addButton(tr("дБ"),QMessageBox::AcceptRole);
msgBox.addButton(tr("оЕФ"),QMessageBox::RejectRole);
if (msgBox.exec()==QMessageBox::AcceptRole)
{
if (!index.isValid()) return;

QSqlRecord record = mod->record(index.row());
gb.transaction();
QSqlQuery *sql_del = new QSqlQuery(gb);
sql_del->prepare("Delete from \"example\".addressbook Where (number = :number)");
sql_del->bindValue(":number", record.value("number").toInt());
sql_del->exec();
qDebug () << sql_del->lastError();
if (sql_del->lastError().type()==QSqlError::NoError)
gb.commit(); //ТБЧОПУЙМШОП refresh
else
gb.rollback(); //ПФЛБФ ОБЪБД
// ПВОПЧМСЕН ЪБРТПУ ДМС ЧЩУЧЕЮЙЧБОЙС ЪБРЙУЕК Ч DBGrid

sselect.clear();
//ЖПТНЙТХЕН ЪБРТПУ ЮЕТЕЪ РБТБНЕФТЩ Й БТЗХНЕОФЩ
sselect.append(tr("select * from \"example\".addressbook"));
mod->setQuery(sselect, gb);
if (mod->lastError().isValid())
{QMessageBox::critical(0, tr("пЫЙВЛБ!"), mod->lastError().text());
}
delete sql_del;
}
}

void query1::on_Change_clicked()
{
QString sselect;
QString ssel_d;
QString ssel_add;

QModelIndex index = r_ui->myTable->currentIndex();//ЪДЕУШ tableView ЙНС DBGrid ОБ ЖПТНЕ
if (!index.isValid())
{
QMessageBox::warning(this, tr("рТЕДХРТЕЦДЕОЙЕ"),QObject::tr("дБООЩЕ ОЕ ЧЩВТБОЩ"));
return;
}
QSqlRecord record = mod->record(index.row());
gb.transaction();

nextform *fkoruj = new nextform(gb, this);
fkoruj->setWindowTitle(tr("йЪНЕОЕОЙЕ УХЭЕУФЧХАЭЕК ЪБРЙУЙ"));


//  ЪОБС Record НПЦОП РПМХЮЙФШ ЧУЕ ЪОБЮЕОЙС ДБООПК УФТПЛЙ
QString x = record.field(0).value().toString();
fkoruj->m_ui->lineEditX->setText(x);
QString y = record.field(1).value().toString();
fkoruj->m_ui->lineEdit->setText(y);
QString z = record.field(2).value().toString();
fkoruj->m_ui->lineEdit_2->setText(z);
QString i = record.field(3).value().toString();
fkoruj->m_ui->lineEdit_3->setText(i);
fkoruj->m_ui->lineEditX->setEnabled(0);


sql_upd->exec();
qDebug() << sql_upd->lastError();

if (sql_upd->lastError().type()==QSqlError::NoError)
{
gb.commit();
sselect.clear();
sselect.append(tr("select * from \"example\".addressbook"));
mod->setQuery(sselect, gb);
if (mod->lastError().isValid())
{QMessageBox::critical(0, tr("пЫЙВЛБ!"), mod->lastError().text());
gb.rollback();
}
delete sql_upd;
}
delete fkoruj;
}
}

Причина редактирования: Используй тег code
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 4.4.2010, 4:26
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


суть этого кода в двух словах, пожалуйста.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Lonely_hermit
  опции профиля:
сообщение 4.4.2010, 7:54
Сообщение #7


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 3.4.2010
Пользователь №: 1590

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 4.4.2010, 5:26) *
суть этого кода в двух словах, пожалуйста.



У нас есть база данных в удалённом доступе. В ней таблица. На форму она выводится объектом QTableView myTable. Чтобы вывести данные на таблицу, мы задали объект QSqlQueryModel mod. Данные на myTable выскакивают неотсортированные. Запрос mod->setQuery("select * from "bla-bla-bla" order by \"id\" asc",gb) не поможет, поскольку происходит вызов вторичной формы, в поля которой мы вносим данные, которые в свою очередь сохраняются в Postgre таблице. Содержимое таблицы меняется по сотне раз на дню. Отслеживаем отправку груза, доставку и т.п. Вызов вторичной формы происходит из первичной по кнопкам "Изменить, "Удалить". Выборка данных происходит по индексу, который пишется в record по mod.
Для того, чтобы отсортировать данные в myTable, создаётся QSortFilterProxyModel pm, которую потом и видит таблица r_ui->myTable->setModel(pm); recordы же выбираются по модели mod, которую на myTable не видно.
Поэтому, когда я выбираю в таблице надпись с "id" 5 (по модели pm) во вторичной форме в поле "id" возникает левая надпись 47 (по модели mod, которую не видно).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 4.4.2010, 9:16
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Положим, что в данной ситуации оправдано использование использование модели запроса (QSqlQueryModel), вместо табличной (QSqlTableModel).
В общем при использовании моделей-посредников нужно решать такие задачи:
1) Обновление модели-посредника после изменения данных в исходной модели.
2) Отображение (перевод) индексов одной модели в индексы другой модели


Отправные точки для решения:
1)
- QSortFilterProxyModel::setDynamicSortFilter(bool)
- Пример

2)
Цитата
The QSortFilterProxyModel acts as a wrapper for the original model. If you need to convert source QModelIndexes to sorted/filtered model indexes or vice versa, use mapToSource(), mapFromSource(), mapSelectionToSource(), and mapSelectionFromSource().
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 16:04