Название: Проблемы новичка с QTableWidget [РЕШЕНО] Отправлено: _Vitaliy_ от Сентябрь 03, 2008, 21:38 Только начал изучать Qt, стоит версия 4.3.1. Решил начать изучение с реального примера: необходимо считать файл данных следующего формата (вложение 102_2662.stf):
t,Hb,Vp,Xv,Xe,Xn ... 79.000 81.633 -600.000 -23.333 5.333 0.000 79.250 81.633 -600.000 -23.333 5.333 -2.609 79.500 81.633 -600.000 -23.333 5.333 -2.609 79.750 81.633 -600.000 -23.333 5.333 -2.609 80.000 81.633 -600.000 -23.333 5.333 -2.609 ... В зависимости от кол-ва параметров (t,Hb,Vp,Xv,Xe,Xn ...) определяется кол-во столбцов QTableWidget"а, кол-во строк данных определяет кол-во строк QTableWidget"а соответственно и записать данные в QTableWidget, с которого потом будет осуществлятся считывание и дальнейшая обработка. Вроде смотрел на примеры, вроде "лазил" по форуму но проблему пока не решил, выкладываю то что наваял я, извиняйте но только учусь. В файле mainform.cpp использую split(' '), как в книге Бланшет, но не могу сделать так что-бы данные записывались во все ячейки строки, а не в первую ячейку, это первая проблема. Вторая заключается в том что не могу пока понять как при запуске программы (то что я написал) появляется новое окно с QTableWidget"ом, вроде в "Десигнере" вставил на форму QTableWidget а как к нему программно обратиться не пойму... Код: mainform.cpp: Заранее признателен если кто укажет на мои "пробелы"... Пользуйтесь тэгом КОД для форматирования исходного кода! Название: Re: Проблемы новичка с QTableWidget Отправлено: lit-uriy от Сентябрь 03, 2008, 22:28 Цитировать не могу пока понять как при запуске программы (то что я написал) появляется новое окно ты его сам создаешь в void MainForm::OpenFile() :с QTableWidget"ом QTableWidget* tbl = new QTableWidget; Цитировать вставил на форму QTableWidget а как к нему программно обратиться не пойму т.к. у тебя множественное наследование класса MainForm, то обращайся в этом классе непосредственно, т.е. как он у тебя в дизайнере обозванНазвание: Re: Проблемы новичка с QTableWidget Отправлено: lit-uriy от Сентябрь 03, 2008, 22:53 вместо:
Код: int f = fields.takeLast().toInt(); Код: int i=0; Название: Re: Проблемы новичка с QTableWidget Отправлено: _Vitaliy_ от Сентябрь 05, 2008, 17:49 lit-uriy, попробовал код который Вы предложили:
Код: ... В этом месте выбивает error: no matching function for call to 'QTableWidgetItem::setData(QStringList&)' ??? Название: Re: Проблемы новичка с QTableWidget Отправлено: ритт от Сентябрь 05, 2008, 18:14 бред. ветку под снос
иди читай документацию Название: Re: Проблемы новичка с QTableWidget Отправлено: ритт от Сентябрь 05, 2008, 22:52 ну, какими тут ссылками поможешь, если наличествует банальное нежелание читать?
ни бланшет, ни шлее, ни папа римский не помогут, если не читать ассистант и/или http://doc.trolltech.com/ > QTableWidgetItem::setData(QStringList&) а строкой ниже кандидатов не показали? Цитировать void QTableWidgetItem::setData ( int role, const QVariant & value ) [virtual] Sets the item's data for the given role to the specified value. > своими высказываниями я отбиваю желание учиться мне кажется, своими высказываниями я прививаю необходимое качество любого кодера и даже, наверное, кастомера - привычку/умение читать документацию взамен привычки гуглить и занудствовать на форумах по каждому вопросу! счастливого изучения документации... с уважением, константин з.ы. не только в языках программирования существует синтаксис и орфограция - в русском языке тоже Название: Re: Проблемы новичка с QTableWidget Отправлено: _Vitaliy_ от Сентябрь 18, 2008, 16:03 Немного разобрался по этому вопросу, наверное отвечу сам себе, может еще кому пригодится, тем более что модератор: "...ветку под снос" (за что спасибо) этого не сделал :)
Код: void MainForm::OpenFile() Единственное сопутствующий вопрос: это хорошо работает для открытия файлов небольшого объема, а если файл более 2 мегабайт "весит" то все очень сильно "тормозит". Вроде надо пользоваться вместо QTableWidget QTableView"ом если у кого-то есть наработки поделитесь плиз Название: Re: Проблемы новичка с QTableWidget Отправлено: pastor от Сентябрь 18, 2008, 16:14 Чтобы интрефейс не "умирал" на время считывания данных из большого файла, добавьте в цикл следующее:
Код: while (!stream.atEnd()) Почитайте по этому поводу Бланшетте, глава "7.3. Сокращение времени отклика при длительной обработке данных." Название: Re: Проблемы новичка с QTableWidget Отправлено: Пантер от Сентябрь 18, 2008, 16:58 Причем чтобы время не сильно увеличилось, можно сделать так:
int i=0; while(.......... { i++; if ((i/100)*100==i) qApp->processEvents(); ......... } То бишь срабатывать будет на каждой сотой итерации. :) Название: Re: Проблемы новичка с QTableWidget Отправлено: _Vitaliy_ от Сентябрь 18, 2008, 17:19 Да, помогло, спасибо, но время открытия файла размером в 2 "метра" составляет более полутора минут, хотя таже самая программа, написанная в Билдере 6.0 это делает на порядок быстрее... может все-таки нужно использовать QTableView, по-моему или у Бланшет или у Шлее об этом сказано.
Название: Re: Проблемы новичка с QTableWidget Отправлено: Alex03 от Сентябрь 18, 2008, 17:26 Код: str = stream.readLine(); Если читать блоками в память, вручную находить концы строк, и уже их потом обрабатывать то получится на порядок (порядки) быстрее. Название: Re: Проблемы новичка с QTableWidget Отправлено: Пантер от Сентябрь 18, 2008, 17:28 Можно отключить обновление, т.е. вначале setUpdatesEnabled(false) и в конце setUpdatesEnabled(true). Но через модель быстрее будет.
Название: Re: Проблемы новичка с QTableWidget Отправлено: ритт от Сентябрь 18, 2008, 17:37 в моделях есть такая фича - fetchMore. я сомневаюсь, что у кого-то найдётся монитор такой диагонали чтобы вся таблица разом влезла в один экран.
QTableWidget - это а) для ленивых; б) для сверхпростых задач. если требуется приличная производительность для больших объёмов данных, пользуемся QTableView/QAbstractItemModel Название: Re: Проблемы новичка с QTableWidget Отправлено: Tonal от Сентябрь 18, 2008, 17:54 Не нужно читать блоками - там тормозов и без этого хватает.
Отключить обновление кардинально поможет, особенно, если стоит автоматический ресайз колонок. В Eric4 так на порядок ускорили загрузку данных профилера. Ну и переход на свою модель тоже даст существенный выигрыш и не только в скорости. :) Название: Re: Проблемы новичка с QTableWidget Отправлено: ритт от Сентябрь 18, 2008, 18:02 Не нужно читать блоками это про fetchMore ?Название: Re: Проблемы новичка с QTableWidget Отправлено: Tonal от Сентябрь 18, 2008, 19:29 Это про stream.readLine(). :)
Название: Re: Проблемы новичка с QTableWidget Отправлено: _Vitaliy_ от Октябрь 09, 2008, 18:50 Решил продолжить здесь, если я не прав то прошу модератора перекинуть в новую ветку.
Подсказали добрые люди ;) как пользоваться моделью для решаемого вопроса, ниже привожу код: это mainform.h Код: #include <QtGui> mainform.cpp Код: # однако скорость к моему глубокому сожалению не возросла :(, пробовал через буфер, в принципе эффект тот-же, если кто-то сталкивался с такой проблемой подскажите плиз Название: Re: Проблемы новичка с QTableWidget Отправлено: Karl-Philipp от Октябрь 09, 2008, 19:36 Мне кажется, что в твоем случае все дело в создании модели.
Для ускорения создания (заполнения) модели сделай наследника от QAbstractItemModel. Пример можно посмотреть в Simple Tree Model. Название: Re: Проблемы новичка с QTableWidget Отправлено: ритт от Октябрь 09, 2008, 23:03 я сотню раз уже писал, что QStandardItemModel медленная и для больших объёмов данных тролли советуют пользоваться оптимизированными наследниками QAbstractItemModel!
Название: Re: Проблемы новичка с QTableWidget Отправлено: _Vitaliy_ от Октябрь 10, 2008, 17:29 спасибо за подсказку, будем пробовать, как сделаю (при наличии времени) обязательно отпишу, может еще кому сгодиться ;)
Название: Re: Проблемы новичка с QTableWidget Отправлено: _Vitaliy_ от Январь 31, 2009, 17:46 Доброго времени суток всем.
Наконец-то добрался до кьютов и разобрался наконец с QTableWidget. Поэтому отвечу сам себе ;) Код
При этом время открытия файла в 10000 строк порядка 7-8 секунд. Код не идеален но работоспособен. Спасибо всем кто подсказывал. Модератору предлагаю перенести ветку в раздел для новичков, там ей самое место. Будем считать что тема закрыта. Название: Re: Проблемы новичка с QTableWidget [РЕШЕНО] Отправлено: Dendy от Январь 31, 2009, 18:08 Раздел для новичков? Ну что вы, не стоит рисковать неокрепшей психикой юных программистов. Предлагаю поместить код в раздел "Комната пыток" и принудительно показывать тем кто нарушает правила форума.
Название: Re: Проблемы новичка с QTableWidget Отправлено: panAlexey от Январь 31, 2009, 19:43 я сотню раз уже писал, что QStandardItemModel медленная и для больших объёмов данных тролли советуют пользоваться оптимизированными наследниками QAbstractItemModel! Как насчет создание раздела: "Грабли" или "Грабли Qt" или "Туда не ходи, снег башка попадет...."?Имхо много полезнее будет, чем "я сотню раз уже писал"... Я тока сегодня 2 темы под это дело присмотрел: эту и по производительности гиф анимации. Что скажете? |