Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [QT4] TableView порядок отображения столбцов


Автор: ecspertiza 18.2.2009, 13:39
Есть на форме компонент QTableView в нём отображаются поля базы данных, в программу необходимо добавить возможность выбора отображаемых столбцов и очерёдность, при этом при выходе из программы это всё должно сохранятся. Отображение нужных столбцов можно реализовать с помощью SQL запроса, а вот порядок?  В QTableView вроде бы нельзя перетаскивать столбцы в нужное положение, как дать пользователю возможность выбирать позицию столбца?

Автор: Elfebet 18.2.2009, 15:18
про порядок столбцов - void QHeaderView::moveSection ( int from, int to ) 
отоброжение нужных столбцов - void QHeaderView::setSectionHidden ( int logicalIndex, bool hide ) 

Автор: SABROG 18.2.2009, 15:28
Цитата(ecspertiza @  18.2.2009,  13:39 Найти цитируемый пост)
В QTableView вроде бы нельзя перетаскивать столбцы в нужное положение, как дать пользователю возможность выбирать позицию столбца? 


Не верю smile
Код

tableView->horizontalHeader();
...
void QHeaderView::sectionMoved ( int logicalIndex, int oldVisualIndex, int newVisualIndex )   [signal]


Соответственно далее QSettings, куда записывается поочередность столбцов для таблицы.

Код

mytable_view = 1,3,4,7,2,0


Тут номера это индекс полей для QSqlQuery::value(index i). Т.е. даже, если у тебя там 30 колонок, то в таблицу можно вывести 6 в нужном порядке.

Значения в QSettings передаются как QVariant тип, а он может содержать списки (QList/QStringList), т.ч. можно сначала заполнить список как тебе нужно, а потом его сохранить. Вроде как StrongDC тоже в xml'е сохраняет позицию колонок.

Автор: ecspertiza 19.2.2009, 09:10
Ну это я так понимаю "программное" перемещение столбцов, а вот чтобы дать пользователю возможность перетаскивать столбцы мышью, это наверное нужно будет создавать класс на основе QTableView и реализовывать механизм drag-and-drop?

Автор: Elfebet 19.2.2009, 10:27
нет, это уже реализовано, в treeview это точно есть.
помоему достаточно заюзать
Код

void QHeaderView::setMovable ( bool movable ) 


Автор: ecspertiza 19.2.2009, 11:54
что то я не до конца понимаю, делаю вот так

Код

void SaveTableParams()
{
    QSettings seting;
    seting.beginGroup("TablePosition");
    QString str; 
    for (int i = 0;i<mainTable->horizontalHeader()->count();i++)
    {
        QString num;
        num.setNum(mainTable->horizontalHeader()->logicalIndex(i));
        seting.setValue(num,mainTable->horizontalHeader()->visualIndex(mainTable->horizontalHeader()->logicalIndex(i)));
    }
    seting.endGroup();
}

void LoadTableParams()
{
    QSettings setting;
    setting.beginGroup("TablePosition");
        for (int i = 0;i<mainTable->horizontalHeader()->count();i++)
        {
            QString num;
            num.setNum(mainTable->horizontalHeader()->logicalIndex(i));
            
            int old_visual = setting.value(num).toInt();
            mainTable->horizontalHeader()->moveSection(mainTable->horizontalHeader()->visualIndex(mainTable->horizontalHeader()->logicalIndex(i))
                    ,old_visual);
        }
    setting.endGroup();
}


позиции не сохраняются, а как то перетасовываются.  Где мог на  грабли наступить?

Автор: ecspertiza 19.2.2009, 12:19
а если сохранять QList 

Код

QList <int> pos; 
    
    for (int i = 0;i<mainTable->horizontalHeader()->count();i++)
    {
        pos << mainTable->horizontalHeader()->visualIndex(i);
    }
    setting.setValue("List",&pos);


то как его потом от туда выгрузить?

Автор: Elfebet 19.2.2009, 12:32
Код

QVariant v = setting.value("List");
if( !v.isNull() )
{
  QList<int> list = v.toList();
}

Автор: ecspertiza 19.2.2009, 12:38
а вот и неугодал, компидятор ошибку выдёт
Код

conversion from `QList<QVariant>' to non-scalar type `QList<int>' requested


я пробовал нечто подобное

Код

QList<int> pos = setting.value("List").toList();


ошибка таже.

Автор: SABROG 19.2.2009, 13:00
Попробуй так

Код

QVariantList mylist;
mylist << 1 << 2 << 3 << 4;
settings.setValue("List", mylist);
...
QVariantList lst = settings.value("List").toList();
int val = lst.at(0).toInt();

Автор: ecspertiza 19.2.2009, 13:07
вобщем заработало как то вот так

Код

void SaveTableParams()
{
    
    QSettings setting("Philotely Operator", "Softinka");
    setting.beginGroup("TableParams");    
    for (int i = 0;i<mainTable->horizontalHeader()->count();i++)
    {
        QString num;
        num.setNum(i);
        setting.setValue(num,mainTable->horizontalHeader()->visualIndex(i));
        str += num +"-"+num2+"\n";
    }
    QMessageBox::information(this,"us",str);
    setting.endGroup();
}

void LoadTableParams()
{
    QSettings setting("Philotely Operator", "Softinka");
    setting.beginGroup("TableParams");
    
    for (int i = 0;i<mainTable->horizontalHeader()->count();i++)
        {
            QString num;
            num.setNum(i);
            int new_visual = setting.value(num).toInt();
            int old_visual = mainTable->horizontalHeader()->visualIndex(i);
            mainTable->horizontalHeader()->moveSection(old_visual,new_visual);
        }

    setting.endGroup();
}


SABROG,Elfebet спасибо за помощь smile

Автор: SABROG 19.2.2009, 13:15
Цитата(ecspertiza @  19.2.2009,  13:07 Найти цитируемый пост)
вобщем заработало как то вот так

Решил упростить отказавшись от logicalIndex? Т.е. если пользователь захочет во время работы вернуть настройки колонок, то у него ничего не получится? smile

Автор: ecspertiza 19.2.2009, 13:22
ну как бы в софте такой фичи не предусмотрено, но если захочет вернуть в дефалтово значение, то можно дописать поцедурку где  в цикле visualIndex сделать равным logicalIndex, а если вернуть настройки которые были при загрузке программы то можно ещё раз вызвать процедуру LoadTableParams().

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)