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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QTableWidget - изменение logicalIndex  (Прочитано 10447 раз)
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.
Но реализовать не получается.
« Последнее редактирование: Февраль 13, 2012, 11:27 от wildcat » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Февраль 13, 2012, 11:26 »

Не парь мозги и юзай модель/представление.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
wildcat
Гость
« Ответ #2 : Февраль 13, 2012, 11:31 »

Т.е. созданную таблицу с отсортировкой столбцов сначала представить как модель, а потом перенаправить в QTableWidget?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Февраль 13, 2012, 11:33 »

Нет. Никакого QTableWidget. Используй модель и QTableView. Вообще, почитай про модель/представление.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
wildcat
Гость
« Ответ #4 : Февраль 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);
« Последнее редактирование: Февраль 13, 2012, 11:48 от wildcat » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Февраль 13, 2012, 11:50 »

Нее, в твоем коде я копаться не буду. Улыбающийся
Ты лучше опиши структуру таблицы и то, что хочешь увидеть.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
wildcat
Гость
« Ответ #6 : Февраль 13, 2012, 12:16 »

Ок. Была такая проблема. есть таблица в sqlite, ее надо было преобразовать визуально, несколькими шагами было это сделано. при меры в вложении.
Из исходной таблицы Table_1... выло сделано два запроса и созданы две промежуточные таблицы.
Две эти промежуточные таблицы были реализованы в tableWidget'e как одна.

Далее в tableWidget колонки были отсортированы.
« Последнее редактирование: Февраль 13, 2012, 12:20 от wildcat » Записан
mutineer
Гость
« Ответ #7 : Февраль 13, 2012, 12:20 »

Вот очень интересно зачем ты в своем коде создавал два TableView? они же не отображаются нигде, я правильно понимаю?
Записан
wildcat
Гость
« Ответ #8 : Февраль 13, 2012, 12:21 »

Они не отображаются)) Отображались, использовал их для просмотра запросов. Но так же используются. для подсчета ячеек таблицы
« Последнее редактирование: Февраль 13, 2012, 12:23 от wildcat » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Февраль 13, 2012, 12:22 »

На сколько мне кажется, это можно сделать одним запросом, но я sql уже достаточно сильно забыл, так что лучше спросить на sql.ru.
Ну, а так, наследуешься от QAbstractItemModel и в ней уже делаешь свои запросы, формируешь данные и хранишь их. И эту модель подсовываешь вьюхе.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
wildcat
Гость
« Ответ #10 : Февраль 13, 2012, 12:26 »

ОК. спрошу на sql форуме. В книгах видел пример только из двух запросов....
Записан
mutineer
Гость
« Ответ #11 : Февраль 13, 2012, 12:27 »

ОК. спрошу на sql форуме. В книгах видел пример только из двух запросов....

Даже делая два запроса ты все равно можешь обойтись одной моделью
Записан
wildcat
Гость
« Ответ #12 : Февраль 13, 2012, 13:21 »

А изменить индекс tableWidget нельзя?
Записан
Bepec
Гость
« Ответ #13 : Февраль 13, 2012, 13:36 »

Чесслово, лучше используй model-View. А уже в нём творить сможешь всё что душеньке угодно Подмигивающий
Записан
wildcat
Гость
« Ответ #14 : Февраль 13, 2012, 13:51 »

Буду пробовать ))
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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