Russian Qt Forum
Ноябрь 23, 2024, 15:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Срочно Помогите с QSqlTableModel!Пожалуйста  (Прочитано 20976 раз)
linuxoid
Гость
« : Август 09, 2007, 12:45 »

как с помощью QSqlTableModel и QTableView открыть для редатактирования табличцу в которой данные совмещены из 3-х разных табличек одной и той же базы данных:?: Использую Qt 4.2.3,linux,MySQL

для просмотра использую QSqlQueryModel со следующей командой:
select cities.city_name,  articles.article_name, sales.kol_vo, sales.dat_real FROM `sales`, `cities`, `articles` WHERE  sales.sit_key = cities.id_key_city AND sales.art_key = id_key_art ORDER BY  sales.dat_real DESC , cities.city_name
тока нужно ещё чтобы я мог редактировать ячейки!помогите пожалуйста!
Записан
-=QT=-
Гость
« Ответ #1 : Август 09, 2007, 13:52 »

http://www.mechta34.com/it/qt4/

И да пребудет с вами сила.  Крутой  :wink:
Записан
linuxoid
Гость
« Ответ #2 : Август 09, 2007, 14:04 »

да там я уже всё перечитал!как мне сделать чтобы открылась таблица в которой совмещены данные из трёх таблиц одной БД и была возможность изменять ячейки в открывшейся таблице??? :?:

и вообще возможно работать с несколькими таблицами в QSqlTableModel???
Записан
-=QT=-
Гость
« Ответ #3 : Август 09, 2007, 14:11 »

Код:
The QSqlRelationalTableModel class provides an editable data model for a single database table, with foreign key support.


И подключаем сколько нужно таблиц.
Только вот быстродействие от такого решения не самое оптимальное ИМХО. Грустный  Грустный

Код:
/****************************************************************************
**
** Copyright (C) 2004-2007 Trolltech ASA. All rights reserved.
**
** This file is part of the example classes of the Qt Toolkit.
**
** Licensees holding a valid Qt License Agreement may use this file in
** accordance with the rights, responsibilities and obligations
** contained therein.  Please consult your licensing agreement or
** contact sales@trolltech.com if any conditions of this licensing
** agreement are not clear to you.
**
** Further information about Qt licensing is available at:
** http://www.trolltech.com/products/qt/licensing.html or by
** contacting info@trolltech.com.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
****************************************************************************/

#include <QtGui>
#include <QtSql>

#include "../connection.h"

void initializeModel(QSqlRelationalTableModel *model)
{
    model->setTable("employee");

    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    model->setRelation(2, QSqlRelation("city", "id", "name"));
    model->setRelation(3, QSqlRelation("country", "id", "name"));

    model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
    model->setHeaderData(1, Qt::Horizontal, QObject::tr("Name"));
    model->setHeaderData(2, Qt::Horizontal, QObject::tr("City"));
    model->setHeaderData(3, Qt::Horizontal, QObject::tr("Country"));

    model->select();
}

QTableView *createView(const QString &title, QSqlTableModel *model)
{
    QTableView *view = new QTableView;
    view->setModel(model);
    view->setItemDelegate(new QSqlRelationalDelegate(view));
    view->setWindowTitle(title);
    return view;
}

void createRelationalTables()
{
    QSqlQuery query;
    query.exec("create table employee(id int primary key, name varchar(20), city int, country int)");
    query.exec("insert into employee values(1, 'Espen', 5000, 47)");
    query.exec("insert into employee values(2, 'Harald', 80000, 49)");
    query.exec("insert into employee values(3, 'Sam', 100, 1)");

    query.exec("create table city(id int, name varchar(20))");
    query.exec("insert into city values(100, 'San Jose')");
    query.exec("insert into city values(5000, 'Oslo')");
    query.exec("insert into city values(80000, 'Munich')");

    query.exec("create table country(id int, name varchar(20))");
    query.exec("insert into country values(1, 'USA')");
    query.exec("insert into country values(47, 'Norway')");
    query.exec("insert into country values(49, 'Germany')");
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    if (!createConnection())
        return 1;
    createRelationalTables();

    QSqlRelationalTableModel model;

    initializeModel(&model);

    QTableView *view = createView(QObject::tr("Relational Table Model"), &model);
    view->show();

    return app.exec();
}
Записан
linuxoid
Гость
« Ответ #4 : Август 09, 2007, 14:56 »

слушай,relation это добавлять в ячейки выпадающий список с данными из других таблиц.
а мне надо чтобы отображал столбики из разных таблиц и я их мог редактировать!
  :!:  :!:
Записан
-=QT=-
Гость
« Ответ #5 : Август 09, 2007, 15:21 »

Соррии... Я еще к этой проблеме не дошел она пока впереди. Но сдается мне что
отображение отображением а редактирование нужно делать в отдельном диалоге.
И связывание релейшеном таблиц как в фокспро тут наверно нет.
Помочь может наверное только редактируемое представление на уровне сервера.

добавлено спустя 39 секунд:

 или написание своей модели ....
Записан
linuxoid
Гость
« Ответ #6 : Август 09, 2007, 15:23 »

каким способом воспользоваться и если можно представьте код для редактирования следующих данных:
(следующий код я использовал для отображеня информации, а надо чтобы я мог редактировать отображённую таблицу)
QSqlQueryModel *model = new QSqlQueryModel();
   model->setQuery("select cities.city_name,  articles.article_name, sales.kol_vo, sales.dat_real FROM `sales`, `cities`, `articles` WHERE  sales.sit_key = cities.id_key_city AND sales.art_key = id_key_art ORDER BY  sales.dat_real DESC , cities.city_name");
   
    model->setHeaderData(4, Qt::Horizontal, QString::fromLocal8Bit("время\nобновл."));
    model->setHeaderData(3, Qt::Horizontal, QString::fromLocal8Bit("дата\nреализации"));
     tableView->setModel(model);
     tableView->resizeRowsToContents();
    tableView->resizeColumnsToContents();
    tableView->show();
Записан
-=QT=-
Гость
« Ответ #7 : Август 09, 2007, 15:37 »

Первое я думаю переопределить setData в модели

вот кусок кода, только для QTreeViewModel c таблицами пока не работал еще.

добавлено спустя 38 секунд:

 bool MyTreeModel::setData(const QModelIndex &index,
                     const QVariant &value, int role)
{
   QSqlDatabase db=QSqlDatabase::database();
   db.transaction();
   QSqlQuery q,q1;
   QStandardItem *i=this->itemFromIndex(index);
   i->setText(value.toString());
   q1.exec("select * from divisions where id="+i->data().toString());
   if(q1.size()!=-1){
      
      q.prepare("update divisions set name=? where id=?");
      q.addBindValue(value);
      q.addBindValue(i->data());
      
   }else{
      q.prepare("insert into divisions (id_p,name) values(?,?)");
      q.addBindValue(i->parent()->data());
      q.addBindValue(value);
   }
   if(!q.exec())
   {
      QMessageBox::critical(0,"",q.lastError().text());
      db.rollback();
      return false;
   }
   if(q1.size()==-1){
      q.prepare("select id from divisions where id_p=? and name=?");
      q.addBindValue(i->parent()->data());
      q.addBindValue(value);
      if(!q.exec())
      {
         QMessageBox::critical(0,"",q.lastError().text());
         db.rollback();
         return false;
      }else{
         q.next();
         i->setData(q.value(0));
      }
   }
   db.commit();
   return true;    
}
Записан
linuxoid
Гость
« Ответ #8 : Август 09, 2007, 15:58 »

а можешь с комментариями написать? а то я чё то не улавливаю хода мысли.
Записан
WW
Гость
« Ответ #9 : Август 09, 2007, 16:26 »

Основная мысль - наследуешься от QSqlQueryModel и переопределяешь setData. в QSqlQueryModel там просто стоит return false
Записан
Sergey B.
Программист
*****
Offline Offline

Сообщений: 544



Просмотр профиля WWW
« Ответ #10 : Август 09, 2007, 16:55 »

Цитата: "WW"
Основная мысль - наследуешься от QSqlQueryModel и переопределяешь setData. в QSqlQueryModel там просто стоит return false


Т.е.  под каждую таблицу, писать свою модель, я правильно понял?
(с переопределённым методом setData())
Грустный

Я в своих программах ловлю currentModelIndex(), и с помощью него беру значение в модели, потом передаю это значение диалогу для редактирования и в том диалоге на кнопку "Save", вешаю
"UPDATE моя_таблица SET данные=значение WHERE параметр=значение"
Записан
linuxoid
Гость
« Ответ #11 : Август 10, 2007, 08:42 »

скинуте пожалуйста код с использованием currentIndex и перенаправлением в диалог с возможностью редактирования!!0
Записан
WW
Гость
« Ответ #12 : Август 10, 2007, 09:28 »

Цитата: "Sergey B."
Т.е.  под каждую таблицу, писать свою модель, я правильно понял?
(с переопределённым методом setData())
Грустный

Я в своих программах ловлю currentModelIndex(), и с помощью него беру значение в модели, потом передаю это значение диалогу для редактирования и в том диалоге на кнопку "Save", вешаю
"UPDATE моя_таблица SET данные=значение WHERE параметр=значение"

Под таблицу юзается QSqlTableModel, где все это уже есть. А человеку нужно обновлять сджойненные таблицы. даже если перехватывать currentIndex, то не факт, что в БД сможешь обновить. Через одбц, например, не получиться, т.к. он умеет обновлять только одну таблицу одновременно. (тут могут быть др. мнения.) а написав свой setData, будешь иметь полный контроль всего и вся. А если что-то универсальное для всех случ. жизни - Дельфи с Билдером в руки. там уже все написано.
Записан
linuxoid
Гость
« Ответ #13 : Август 10, 2007, 09:44 »

а можно ли использовать Qt::ItemIsEditable в QSqlQueryModel?если можно то как?
Записан
WW
Гость
« Ответ #14 : Август 10, 2007, 10:18 »

Цитата: "linuxoid"
а можно ли использовать Qt::ItemIsEditable в QSqlQueryModel?если можно то как?

Еще раз глаголю: отнаследуйся от QSqlQueryModel и можно будет использовать все.
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.053 секунд. Запросов: 23.