Russian Qt Forum

Qt => Базы данных => Тема начата: wildcat от Январь 31, 2012, 10:24



Название: Подключение к БД и вывод в TableView
Отправлено: wildcat от Январь 31, 2012, 10:24
Здравствуйте.
Есть проблема.
Имеется программа которая создает свою БД sqlete, как можно вывести данную БД в имеющийся TableView для дальнейшего ее редактирования.

вот подключаюсь к БД.
Код
C++ (Qt)
bool createConnection()
{
   QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
   db.setDatabaseName("/var/db/ddb.sl3");
   if (!db.open()) {
       QMessageBox::warning(0, QObject::tr("Database Error"),
                            db.lastError().text());
       return false;
   }
   return true;
}

все подключается, ошибок нет. А как вывести ее в TableView?


Название: Re: Подключение к БД и вывод в TableView
Отправлено: Пантер от Январь 31, 2012, 10:27
QSqlTableModel или QSqlQueryModel.


Название: Re: Подключение к БД и вывод в TableView
Отправлено: wildcat от Январь 31, 2012, 15:45
Перечитал документацию QSqlTableModel и QSqlQueryModel.
Не могу разобраться, как отобразить существующую БД в созданом TableView.
Есть у кого нибудь источник где можно это посмотреть?


Название: Re: Подключение к БД и вывод в TableView
Отправлено: Пантер от Январь 31, 2012, 15:49
Перечитал документацию QSqlTableModel и QSqlQueryModel.
Не заметно. http://doc.qt.nokia.com/4.8-snapshot/sql-tablemodel.html - тут что не понятно?


Название: Re: Подключение к БД и вывод в TableView
Отправлено: wildcat от Январь 31, 2012, 16:44
для меня, это какой-то темный лес. Стараюсь его осветлить))
Мне там не понятно, где эта БД подключается, т.е. где там указывается путь к БД которую необходимо отобразить.


Название: Re: Подключение к БД и вывод в TableView
Отправлено: wildcat от Февраль 01, 2012, 12:11
Все получилось... Я не правильно указывал название таблицы SQL, по этому мне ничего не заполнялось данными. Теперь все заработало.


Название: Re: Подключение к БД и вывод в TableView
Отправлено: wildcat от Февраль 01, 2012, 15:43
Не пойму почему, когда запускаю программу, таблица sql отображается и сразу исчезает. Не подскажете, что не так делаю?
Код
C++ (Qt)
 
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
   db.setDatabaseName("/var/db/surd/ddb.sl3");
   if (!db.open())
       {
           qDebug() << QObject::trUtf8("не могу открыть БД") << db.lastError().text();
 
       }
 
    QSqlTableModel model;
    model.setTable("UsbProperties");
    model.select();
    tableView->setModel(&model);
 


Название: Re: Подключение к БД и вывод в TableView
Отправлено: Пантер от Февраль 01, 2012, 15:50
Ты создаешь модель на стеке и она уничтожается при выходе из области видимости. Создавай в куче.


Название: Re: Подключение к БД и вывод в TableView
Отправлено: wildcat от Февраль 01, 2012, 16:10
спасибо, все исправил

Код
C++ (Qt)
    QSqlTableModel *model;
    model = new QSqlTableModel();
    model->setTable("UsbProperties");
    model->select();
    tableView->setModel(model);


Название: Re: Подключение к БД и вывод в TableView
Отправлено: wildcat от Февраль 01, 2012, 20:49
С отображением таблицы все разрешилось. Но проблема осталась. Дело в том что таблицы в SQL не совсем правильная, изменить ее там нельзя. Не подскажете, возможно изменить ее отображение в TableView'ре подобным обрзазом? Примеры таблиц во влажении.


Название: Re: Подключение к БД и вывод в TableView
Отправлено: Пантер от Февраль 02, 2012, 07:24
Можно сделать вьюху в базе и ее открывать, а можно заюзать QSqlRelationalTableModel.


Название: Re: Подключение к БД и вывод в TableView
Отправлено: wildcat от Февраль 02, 2012, 11:05
решил реализовать это с помощью нескольких запросов. Вот только не получается сделать сортировку.
Код
C++ (Qt)
QSqlQueryModel* query;
     query = new QSqlQueryModel();
     query->setQuery("SELECT KEY, Value FROM UsbProperties");
     query->sort(1);
 
          tableView->setModel(query);

Хочу что бы получилось user к user, group к group. т.е сначала шли одни, потом другие.


Название: Re: Подключение к БД и вывод в TableView
Отправлено: Пантер от Февраль 02, 2012, 11:06
Дык в запросе и сортируй - ORDER BY.


Название: Re: Подключение к БД и вывод в TableView
Отправлено: wildcat от Февраль 02, 2012, 11:47
Спасибо. Все сортируется.

Не подскажете, как можно реализовать, так что бы получилось:
Пробовал QSqlRelationalTableModel, нашел примеры замены ключа и наследование комбобокса.


Название: Re: Подключение к БД и вывод в TableView
Отправлено: wildcat от Февраль 02, 2012, 15:01
Делаю два запроса.

Код
C++ (Qt)
//________________________________первый запрос________________
     QSqlQueryModel *model = new QSqlQueryModel;
     model->setQuery("SELECT DISTINCT KEY FROM( SELECT KEY,  Value FROM UsbProperties)");
     QTableView *table_sort = new QTableView();
     table_sort->setModel(model);
     table_sort->show();
 
//________________________________второй запрос________________
     QSqlQueryModel *query= new QSqlQueryModel;
     query->setQuery("SELECT Value FROM( SELECT KEY,  Value FROM UsbProperties)");
     QTableView *table_sort_1 = new QTableView();
     table_sort_1->setModel(query);
     table_sort_1->show();

Получается 2ве таблицы вида во вложении. Первая таблица это название колонок, а вторая это данные. Можно из двух таблиц склеить одну?


Название: Re: Подключение к БД и вывод в TableView
Отправлено: wildcat от Февраль 03, 2012, 10:51
С ответами туго )) Может кому пригодится, только в новой таблице осталось заменить название колонок. Название колонок присваиваются из первого запроса:

Код
C++ (Qt)
void usbController::s_buttonBox_connect()
{
   QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
   db.setDatabaseName("/var/db/ddb.sl3");
   if (!db.open())
       {
           qDebug() << QObject::trUtf8("Не смогла я открыть базу данных") << db.lastError().text();
       }
//________________________________первый запрос________________
   const char * s1 = "SELECT KEY,  Value FROM UsbProperties",
           * s2 = "SELECT DISTINCT KEY FROM";
     QSqlQueryModel *model = new QSqlQueryModel;
     model->setQuery(QString("")+s2+"("+s1+")");
     QTableView *table_sort = new QTableView();
     table_sort->setModel(model);
 
//________________________________второй запрос________________
     QString s3= QString("SELECT Value FROM(")+s1+")";
     QSqlQueryModel *query= new QSqlQueryModel;
     query->setQuery(s3);
     QTableView *table_sort_1 = new QTableView();
     table_sort_1->setModel(query); // заносим все в таблицу
 
 
     int i = 0;
     int z=0;
     int j = 0;
     int count = 0;
     QString s,s_1;
     QString s4 = s3;
     QSqlQuery q(s4);
     QSqlQuery q_1(s4);
     int column=0;
     int row = 0;
//____________________________подсчет значений___________
     while (q.next())
     {
     s_1 = table_sort_1->model()->data(table_sort_1->model()->index(z++,j)).toString();
     }
     count = z;
     qDebug() << QString("Items in list: ") << count;
 
//____________________________Заполняем новую таблицу, перенос столбцов с троки________
     while (q_1.next())
     {
     s = table_sort_1->model()->data(table_sort_1->model()->index(i++,j)).toString();
    //qDebug(s.toAscii()); //просмотр вывода текста слолбца таблицы
     QTableWidgetItem *item = new QTableWidgetItem(s);
     tableWidget->setColumnCount(6); // кол-во столбцов
     tableWidget->setRowCount(count/6); //подсчет кол-во строк
     tableWidget->setItem(row,column,item);
     column++;
     }
 
}


Название: Re: Подключение к БД и вывод в TableView
Отправлено: wildcat от Февраль 03, 2012, 12:53
Можете подсказать как в tableWidget после его заполнения поменять столбцы местами?


Название: Re: Подключение к БД и вывод в TableView
Отправлено: Пантер от Февраль 06, 2012, 09:32
Можете подсказать как в tableWidget после его заполнения поменять столбцы местами?

void QHeaderView::moveSection ( int from, int to )


Название: Re: Подключение к БД и вывод в TableView
Отправлено: wildcat от Февраль 09, 2012, 09:29
Спасибо.
Получается, что то вроде этого:
Код
C++ (Qt)
     tableWidget->horizontalHeader()->moveSection(3,0);
     tableWidget->horizontalHeader()->moveSection(5,1);
     tableWidget->horizontalHeader()->moveSection(3,2);
     tableWidget->horizontalHeader()->moveSection(5,4);