crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> TableView и QAbstractItemModel
_Vitaliy_
  опции профиля:
сообщение 20.11.2008, 22:37
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 59
Регистрация: 20.11.2008
Пользователь №: 428

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




Репутация:   0  


Я новичок в использовании кьют"ов, пытаюсь переделать программу написанную на билдере. Собственно вопрос. Необходимо считать файл данных в виде (например):
х1, х2, х3
0 1 2
3 4 5
6 7 8
При этом количество столбцов может варьироваться, количество строк превышает несколько тысяч.
Пробовал использовать QTableWidget довольно просто использовать но очень медленно, файл открывается несколько минут :-(. Покопался в документации где предложено использовать TableView и QAbstractItemModel, но никак не могу это сделать. Подскажите пожалуйста как можно решить задачу, если есть готовая заготовка буду очень признателен.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.11.2008, 10:17
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


поищи по форуму, ключевые слова QAbstractItemModel и QStandartItemModel, было близкое к твоему, если вовсе не такое же.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sploid
  опции профиля:
сообщение 21.11.2008, 11:28
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 51
Регистрация: 26.2.2008
Из: Москва
Пользователь №: 106

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




Репутация:   1  


вопрос где у тебя затыка, в виджете, который отображает или в чтении.
выложи код.
я в свое время тестил QTableWidget и он более-менее ( ну никак не минуты ) отображал десятки тысяч строк.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
_Vitaliy_
  опции профиля:
сообщение 21.11.2008, 20:14
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 59
Регистрация: 20.11.2008
Пользователь №: 428

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




Репутация:   0  


2 sploid, вот код. Прошу простить за стилистику, так как писалось быстро...

void MainForm::OpenFile()
{
QString fileName = QFileDialog::getOpenFileName(this);

QFile file (fileName);
if (file.open(QIODevice::ReadOnly))
    {
        QTextStream stream(&file);
        
        stream.setCodec("CP-866");
        
        QTableWidget* tbl = new QTableWidget;
        
          lst << "First" << "Second" << "Third";
            tbl->setHorizontalHeaderLabels(lst);
            
    tbl->setColumnCount(5);
    tbl->setRowCount(5);
    
    int f=0, row=0,col=0, tt=0, vv=0;
    
    QString str;
    QString fff, ggg;
    QList<QString> gg;
    QStringList fields;
    
            while (!stream.atEnd())
                {
                    str = stream.readLine(); //chtenie stroki
                    str = str.simplified();  //ubiraet pustie probeli v stroke
                    if (tt<=3)    fields = str.split(",");
                    if (tt>3)    fields = str.split(' ');
                    
                    tbl->setColumnCount(f);
                    tbl->setRowCount(tt+1);
                    gg = fields;
                    
                    f = fields.size();        
                                            
                    for (int i=0; i<=(f-1); ++i)
                    {
                        fff = gg.at(i);
                        QTableWidgetItem *item = new QTableWidgetItem;
                        item->setText(QString(fff));
                        tbl->setItem(tt, i, item);
                    }

                ++tt;
     qApp->processEvents();
                }
    if (stream.status() != QTextStream::Ok)
        {
                        qDebug() << "error";
        }
        
file.close();
tbl->show();
}


буду признателен за помощь
Причина редактирования: используйте тэг code=cpp
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sploid
  опции профиля:
сообщение 21.11.2008, 22:08
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 51
Регистрация: 26.2.2008
Из: Москва
Пользователь №: 106

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




Репутация:   1  


попробуй в начале все прочитать, а уже потом вызывать
tbl->setColumnCount(f);
tbl->setRowCount(tt+1);
у тебя кол-во строк меняется на каждой строке данных.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость__Vitaliy__*_*
сообщение 21.11.2008, 22:22
Сообщение #6





Гости








    


Дело в том что при помощи tbl->setColumnCount(f) я определяю количество столбцов (они могут варьироваться)
а tbl->setRowCount(tt+1) я увеличиваю количество строк, оно тоже неизвестно, поэтому заранее обозначить размерность таблицы я не могу :-(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sploid
  опции профиля:
сообщение 21.11.2008, 23:04
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 51
Регистрация: 26.2.2008
Из: Москва
Пользователь №: 106

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




Репутация:   1  


ты немного не понял мою идею. должно быть примерно так ( не компилил ):
// открываем файл
QFile input( "file_name.txt" );
QTextStream stream( input );
// выбранные из файла сначения
QVector< QStringList > fields;
// максимальное кол-во столбцов
int max_columns = 0;
// читаем до конца
while ( !stream.atEnd( ) )
{
  // текущая строка
  const QString line = stream.readLine( ).simplified();
  fields.push_back( line.split( " " ) );
  max_columns = qMax( max_columns, fields[ fields.count( ) - 1 ].count( ) );
}
// выставляем размер таблицы
tbl->setColumnCount( max_columns );
tbl->setRowCount( fields.count( ) );
// заполняем таблицу
for ( int nn = 0; nn < fields.count( ); ++nn )
{
  for ( int mm = 0; mm < fields[ nn ].count( ); ++mm )
  {
    QTableWidgetItem *item = new QTableWidgetItem;
    item->setText( fields[ nn ][ mm ] );
     tbl->setItem( nn, mm, item );
  }
}


идея понятна?

Сообщение отредактировал sploid - 21.11.2008, 23:06
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.11.2008, 23:23
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


_Vitaliy_, яб на твоем месте сделал так:
1) прочитал первую строку, т.е. заголовки столбцов
...// читаем строку из файла
QStringList vals = str.split(","); // значения столбцов в строке
int valcnt = vals.size();// кол-во значений (столбцов)

2) установил сразу число колонок в талбичном виджете
tbl->setColumnCount(valcnt);// устанавливаем кол-во столбцов

3) создал новую строку, записав в нее заголовки столбцов
tbl->insertRow(0);//вставляем самую первую строку

int i=0;
  while (i<valcnt)
  {
    QTableWidgetItem *item = new QTableWidgetItem;
    item->setText(vals[i]);
     tbl->setItem( 0, i, item );
  }

4) в цикле начал построчно читать файл и раскладывать прочитанное по столбцам
while ( !stream.atEnd() )
{
...// читаем строку из файла
QStringList vals = str.split(","); // значения столбцов в строке
tbl->insertRow(tbl->rowCount());//вставляем строку
...// вставляем значения как в п. 3
}


хе, пока я писал sploid, успел пример привести :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
_Vitaliy_
  опции профиля:
сообщение 22.11.2008, 9:11
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 59
Регистрация: 20.11.2008
Пользователь №: 428

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




Репутация:   0  


Спасибо товарищи Litkevich Yuriy и sploid за участие. :clapping:
Как освобожусь, попробую переделать и обязательно отпишу результаты "эксперимента" :rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 22.11.2008, 17:48
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(_Vitaliy_ @ 22.11.2008, 12:11) *
3) создал новую строку, записав в нее заголовки столбцов
к стати забыл в цикле инднкс увеличивать (i++; )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 30.11.2024, 10:13