Russian Qt Forum

Qt => Вопросы новичков => Тема начата: wildcat от Февраль 13, 2012, 11:24



Название: QTableWidget - изменение logicalIndex
Отправлено: wildcat от Февраль 13, 2012, 11:24
Была создана таблица (tableWidget), собранная из двух таблиц запросом БД QSQLITE.
Так как столбцы в tableWidget были не в том визуальном порядке. в котором нужно, тх визуальный порядок был изменен таким образом:

Код
C++ (Qt)
     tableWidget->horizontalHeader()->moveSection(3,0);
     tableWidget->horizontalHeader()->moveSection(5,1);
     tableWidget->horizontalHeader()->moveSection(3,2);
     tableWidget->horizontalHeader()->moveSection(5,3);
 

Визуально все хорошо отображается... Но имеются ряд каких то багов.. Таблица tableWidget  - создается при клике по кнопке. При первом клике отображение визуально как и нужно, а при втором клике отображение столбцов меняется.

Как понял огический индекс не меняется, меняется только визуальный... Как можно приравнять логический индекс к визуальному?

Вот просмотреть логический индекс относительно визуального могу:

Код
C++ (Qt)
for (int i=0; i<6; ++i)
     {
     int col=tableWidget->horizontalHeader()->logicalIndex(i);
     qDebug()<<col;
 
     }
qDebug  выводит - 5, 1, 4, 0, 2

Так понимаю что это делается с помощью
int QHeaderView::logicalIndex ( int visualIndex ) const.
Но реализовать не получается.


Название: Re: QTableWidget - изменение logicalIndex
Отправлено: Пантер от Февраль 13, 2012, 11:26
Не парь мозги и юзай модель/представление.


Название: Re: QTableWidget - изменение logicalIndex
Отправлено: wildcat от Февраль 13, 2012, 11:31
Т.е. созданную таблицу с отсортировкой столбцов сначала представить как модель, а потом перенаправить в QTableWidget?


Название: Re: QTableWidget - изменение logicalIndex
Отправлено: Пантер от Февраль 13, 2012, 11:33
Нет. Никакого QTableWidget. Используй модель и QTableView. Вообще, почитай про модель/представление.


Название: Re: QTableWidget - изменение logicalIndex
Отправлено: wildcat от Февраль 13, 2012, 11:45
Пользовался моделью... Но при создании таблицы из двух предыдущих, выхода кроме использования QtableWidget е\не нашел.

Если не трудно посмотрите:

Код
C++ (Qt)
//подключаемся к БД
   QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
   db.setDatabaseName("/var/db/surd/surddb.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; // количесво ячеек table_sort_1
     int j = 0;
     int count = 0;
     QString s,s_2;
     QString s4 = s3;
     QSqlQuery q(s4);
     QSqlQuery q_1(s4);
     QSqlQuery q_2(QString("")+s2+"("+s1+")");
     int column=0;
     int row = 0;
//____________________________подсчет ячеек_что бы найти строки___________
     while (q.next())
     {
     table_sort_1->model()->data(table_sort_1->model()->index(z++,j));
     }
     count = z;
 
//____________________________Заполняем новую таблицу_____________________
     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++;
     }
      i=0;
      int hcolumn = 0; // индекс заголовка таблицы
 
 
//______________________________заполняем заголовок таблыцы________________________
      while (q_2.next())
     {
     s_2 = table_sort->model()->data(table_sort->model()->index(i++,j)).toString();
       QTableWidgetItem *item = new QTableWidgetItem(s_2);
     tableWidget->setHorizontalHeaderItem(hcolumn,item);
     hcolumn++;
     }
 
//______________________________сортировка столбцов__________________________________
 
     tableWidget->setColumnWidth(3,150); //USB_NAME
     tableWidget->setColumnWidth(1,180); //iserial
 
//_____меняем столбы местами... замена визуального индекса, логический не меняется..
     tableWidget->horizontalHeader()->moveSection(3,0);
     tableWidget->horizontalHeader()->moveSection(5,1);
     tableWidget->horizontalHeader()->moveSection(3,2);
     tableWidget->horizontalHeader()->moveSection(5,3);
 
//______________просмотр логического индекса относительно вызуального
 
     for (int i=0; i<6; ++i)
     {
     int col=tableWidget->horizontalHeader()->logicalIndex(i);
     qDebug()<<col;
 
     }
 
     tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); //запрет редактирования таблицы
//_______________выделение строго одной строки
     tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
     tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
     tableWidget->selectRow(0);


Название: Re: QTableWidget - изменение logicalIndex
Отправлено: Пантер от Февраль 13, 2012, 11:50
Нее, в твоем коде я копаться не буду. :)
Ты лучше опиши структуру таблицы и то, что хочешь увидеть.


Название: Re: QTableWidget - изменение logicalIndex
Отправлено: wildcat от Февраль 13, 2012, 12:16
Ок. Была такая проблема. есть таблица в sqlite, ее надо было преобразовать визуально, несколькими шагами было это сделано. при меры в вложении.
Из исходной таблицы Table_1... выло сделано два запроса и созданы две промежуточные таблицы.
Две эти промежуточные таблицы были реализованы в tableWidget'e как одна.

Далее в tableWidget колонки были отсортированы.


Название: Re: QTableWidget - изменение logicalIndex
Отправлено: mutineer от Февраль 13, 2012, 12:20
Вот очень интересно зачем ты в своем коде создавал два TableView? они же не отображаются нигде, я правильно понимаю?


Название: Re: QTableWidget - изменение logicalIndex
Отправлено: wildcat от Февраль 13, 2012, 12:21
Они не отображаются)) Отображались, использовал их для просмотра запросов. Но так же используются. для подсчета ячеек таблицы


Название: Re: QTableWidget - изменение logicalIndex
Отправлено: Пантер от Февраль 13, 2012, 12:22
На сколько мне кажется, это можно сделать одним запросом, но я sql уже достаточно сильно забыл, так что лучше спросить на sql.ru.
Ну, а так, наследуешься от QAbstractItemModel и в ней уже делаешь свои запросы, формируешь данные и хранишь их. И эту модель подсовываешь вьюхе.


Название: Re: QTableWidget - изменение logicalIndex
Отправлено: wildcat от Февраль 13, 2012, 12:26
ОК. спрошу на sql форуме. В книгах видел пример только из двух запросов....


Название: Re: QTableWidget - изменение logicalIndex
Отправлено: mutineer от Февраль 13, 2012, 12:27
ОК. спрошу на sql форуме. В книгах видел пример только из двух запросов....

Даже делая два запроса ты все равно можешь обойтись одной моделью


Название: Re: QTableWidget - изменение logicalIndex
Отправлено: wildcat от Февраль 13, 2012, 13:21
А изменить индекс tableWidget нельзя?


Название: Re: QTableWidget - изменение logicalIndex
Отправлено: Bepec от Февраль 13, 2012, 13:36
Чесслово, лучше используй model-View. А уже в нём творить сможешь всё что душеньке угодно ;)


Название: Re: QTableWidget - изменение logicalIndex
Отправлено: wildcat от Февраль 13, 2012, 13:51
Буду пробовать ))


Название: Re: QTableWidget - изменение logicalIndex
Отправлено: wildcat от Февраль 13, 2012, 15:36
Не подскажете нормальную литературу где можно посмотреть реализацию моделей? Я так понимаю мне придется воспользоваться QAbstractTableModel.


Название: Re: QTableWidget - изменение logicalIndex
Отправлено: Пантер от Февраль 13, 2012, 15:37
Начинай отсюда (http://ru.wikipedia.org/wiki/Model-View-Controller).


Название: Re: QTableWidget - изменение logicalIndex
Отправлено: mutineer от Февраль 13, 2012, 15:39
В доках Qt тоже неплохо написано. Я почти только ими пользовался


Название: Re: QTableWidget - изменение logicalIndex
Отправлено: wildcat от Февраль 13, 2012, 15:45
Спасибо ))


Название: Re: QTableWidget - изменение logicalIndex
Отправлено: wildcat от Февраль 13, 2012, 16:25
как понял, проще всего создать модель, определить в ней структуру и все отобразить в tableview. Теперь понял, как можно все сделать одним запросом...

У меня было два запроса, первый запрос выдавал название будущих столбцов, другой данный будущей таблицы.

Так подумал, ведь можно вывести данные которые нужны, а название колонок задать вручную.

Что то до меня ни как не дойдет... вот создаю модель запроса из таблицы:

Код
C++ (Qt)
QSqlQueryModel *model= new QSqlQueryModel; // создаю модель
     model->setQuery("SELECT Value FROM(SELECT KEY,  Value FROM UsbProperties)"); // заполняю модель запросом из sql db
     QTableView *table_sort_1 = new QTableView(); //создаю таблицу
     table_sort_1->setModel(model); // отображаю модель в таблицу
     table_sort_1->show(); // вывожу таблицу на просмотр
 

Все создается... А каким методом редактировать саму модель?


Название: Re: QTableWidget - изменение logicalIndex
Отправлено: Пантер от Февраль 13, 2012, 16:28
Редактировать уже вручную своими sql запросами.