Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [QT4] TableView порядок отображения столбцов 
V
    Опции темы
ecspertiza
Дата 18.2.2009, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: 4
Всего: 5



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


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
Elfebet
Дата 18.2.2009, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

Репутация: 5
Всего: 14



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


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
SABROG
Дата 18.2.2009, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(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'е сохраняет позицию колонок.

Это сообщение отредактировал(а) SABROG - 18.2.2009, 15:42


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
ecspertiza
Дата 19.2.2009, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: 4
Всего: 5



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


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
Elfebet
Дата 19.2.2009, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

Репутация: 5
Всего: 14



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

void QHeaderView::setMovable ( bool movable ) 




--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
ecspertiza
Дата 19.2.2009, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: 4
Всего: 5



что то я не до конца понимаю, делаю вот так

Код

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();
}


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


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
ecspertiza
Дата 19.2.2009, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: 4
Всего: 5



а если сохранять QList 

Код

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


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


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
Elfebet
Дата 19.2.2009, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

Репутация: 5
Всего: 14



Код

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


Это сообщение отредактировал(а) Elfebet - 19.2.2009, 12:33


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
ecspertiza
Дата 19.2.2009, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: 4
Всего: 5



а вот и неугодал, компидятор ошибку выдёт
Код

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


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

Код

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


ошибка таже.


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
SABROG
Дата 19.2.2009, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Попробуй так

Код

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


Это сообщение отредактировал(а) SABROG - 19.2.2009, 13:02


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
ecspertiza
Дата 19.2.2009, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: 4
Всего: 5



вобщем заработало как то вот так

Код

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


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
SABROG
Дата 19.2.2009, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



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

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


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
ecspertiza
Дата 19.2.2009, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: 4
Всего: 5



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


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1046 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.