crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QTableView QAbstractmodel
FakeMoNEy
  опции профиля:
сообщение 27.11.2012, 23:59
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 7
Регистрация: 27.11.2012
Пользователь №: 3612

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здравствуйте, у меня есть несколько вопросов
1)Я заполняю таблицу в цикле, на форрме есть statusbar на нем qlabel
void MainWindow::createStatusBar()
{
    StatusLabel = new QLabel;
    StatusLabel->setAlignment(Qt::AlignLeft);
    StatusLabel->setMinimumSize(100,10);
    statusBar()->addWidget(StatusLabel);
}

В цикле заполнения таблицы я обновляю статус бар, в нем написано сколько строк обработано вот так [10/1000]
Заполнение идет долго строк бывает много, и если кликнуть на окно программы окошко зависает и самодельный прогресс бар больше не обновляется, пробовал отключать сигналы у виджетов, не помогает, как решить данную проблему, фильтр эвентов?

2)Использую QTableView и QStandardItemModel мне нужно чтобы при нажатии на строку она раскрывалась (что-то вроде QTreeview) но не только вниз, а в две стороны, (т.е строка которая раскрывает подстроки должна стоять в середине этих подстрок), в левом столбце таблицы в зависимости от того можно ли при клике на поле раскрыть группу подстрок, стоит + или - если группа подстрок раскрыта, или ничего если строка без группы подстрок.
Я использую SetRowHidden() в QTableview т.к. ничего другого не нашел.
Строк много бывает до 2 миллионов а может и больше. Соответственно долго заполняет, как ускорить? Наследоваться от QAbstractmodel? Или в создать базу данных? Может есть варианты наследоваться от QAbstractmodel при этом сделать подстроки как описано выше не используя setRowHidden если да можно какой нибудь минималистичный пример с подстроками?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 28.11.2012, 2:04
Сообщение #2


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


1) Keeping the GUI Responsive
думаю
QCoreApplication::processEvents();
будет достаточно, в цикле
учтите что это замедлит программу, немного

2) setRowHidden - очень медленный способ
остальное не понял, нужен скрин
"QAbstractmodel" вряд ли даст существенный прирост
если нужна частичное выборка, а не сразу все 2млн строк - то да, лучше база, пусть даже sqlite
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
FakeMoNEy
  опции профиля:
сообщение 6.12.2012, 5:11
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 7
Регистрация: 27.11.2012
Пользователь №: 3612

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(RazrFalcon @ 28.11.2012, 3:04) *
1) Keeping the GUI Responsive
думаю
QCoreApplication::processEvents();
будет достаточно, в цикле
учтите что это замедлит программу, немного

2) setRowHidden - очень медленный способ
остальное не понял, нужен скрин
"QAbstractmodel" вряд ли даст существенный прирост
если нужна частичное выборка, а не сразу все 2млн строк - то да, лучше база, пусть даже sqlite

Вот так выглядит таблица

Вот так после нажатия на плюс в первом столбце
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 6.12.2012, 16:11
Сообщение #4


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Даже учитывая что это дерево чистой воды, самый простой способ реализации на таблице будет через скрытие строк.
Более сложный и быстрый - через QSortFilterProxyModel и filterAcceptsRow.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 18.2.2025, 5:54