Russian Qt Forum
Декабрь 19, 2024, 21:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Проблемы новичка с QTableWidget [РЕШЕНО]  (Прочитано 29161 раз)
Tonal
Гость
« Ответ #15 : Сентябрь 18, 2008, 19:29 »

Это про stream.readLine(). Улыбающийся
Записан
_Vitaliy_
Гость
« Ответ #16 : Октябрь 09, 2008, 18:50 »

Решил продолжить здесь, если я не прав то прошу модератора перекинуть в новую ветку.
Подсказали добрые люди  Подмигивающий как пользоваться моделью для решаемого вопроса, ниже привожу код:

это mainform.h
Код:
#include <QtGui>
#include <QTextStream>
#include <QTableWidget>
#include <QStandardItemModel>
//#include <QTableWidgetItem>
#include <QStringList>
//
class MainForm : public QMainWindow, public Ui::MainWindow
{
Q_OBJECT
public:
MainForm( QWidget * parent = 0, Qt::WFlags f = 0 );
QStringList       lst;
QStandardItemModel* model;

private slots:

void OpenFile();

};
#endif


mainform.cpp
Код:
#
include "mainform.h"
//
MainForm::MainForm( QWidget * parent, Qt::WFlags f)
: QMainWindow(parent, f)
{
setupUi(this);
connect(pushButton, SIGNAL(clicked()), this, SLOT(OpenFile()));
model=new QStandardItemModel(this);
view->setModel(model);
}
//


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

QFile file (fileName);
if (file.open(QIODevice::ReadOnly))
{
QTextStream stream(&file);

stream.setCodec("CP-866");

int siz=0, size_file=0, f=0, row=0, col=0;
   
    QString str;
    QString fff, ggg;
    QList<QString> gg;
    QStringList fields;
   
     
    // dlya sozdaniya okna progressa
    siz = file.size();
    size_file = siz/190; // razmer % dlya progressDialog
   
    QProgressDialog* pprd =
new QProgressDialog(tr("Progressing the data..."), tr("&Cancel"), 0, size_file,this);
pprd->setModal(true);  // ustanovka modalnosti okna
pprd->setMinimumDuration(0);
pprd->setWindowTitle("Please Wait");

    model->clear();
model->setColumnCount(f);
view->setUpdatesEnabled(false);

QTime timer(0,0,0,0);
QTime tim(0,0,0,0);
timer.start();
   //char buf[256];
 
   
    while (!stream.atEnd())
{
str = stream.readLine();
///qint64 lineLength = file.readLine(buf, sizeof(buf));
///str = buf;
//str = stream.readLine(); //chtenie stroki
str = str.simplified();  //ubiraet pustie probeli v stroke
if (row<=3) fields = str.split(",");
if (row>3) fields = str.split(' ');

model->setRowCount(row+1);
gg = fields;

for (col=0; col<=(fields.size()-1); ++col)
{
fff = gg.at(col);
QStandardItem *item = new QStandardItem(QString(fff));
model->setItem(row, col, item);
}
pprd->setValue(row) ;  // progress
qApp->processEvents();
if (pprd->wasCanceled()) break;

  ++row;
}

if (stream.status() != QTextStream::Ok)
{
qDebug() << "╨Ю╤И╨╕╨▒╨║╨░ ╤З╤В╨╡╨╜╨╕╤П ╤Д╨░╨╣╨╗╨░";
}

tim = tim.addMSecs(timer.elapsed());
this->setWindowTitle(QString(tim.toString("m:s:z")));

delete pprd; //unichtozhenie okna  QProgressDialog

view->setUpdatesEnabled(true);
file.close();
}


однако скорость к моему глубокому сожалению не возросла  Грустный, пробовал через буфер, в принципе эффект тот-же, если кто-то сталкивался с такой проблемой подскажите плиз
Записан
Karl-Philipp
Гость
« Ответ #17 : Октябрь 09, 2008, 19:36 »

Мне кажется, что в твоем случае все дело в создании модели.

Для ускорения создания (заполнения) модели сделай наследника от QAbstractItemModel. Пример можно посмотреть в Simple Tree Model.
Записан
ритт
Гость
« Ответ #18 : Октябрь 09, 2008, 23:03 »

я сотню раз уже писал, что QStandardItemModel медленная и для больших объёмов данных тролли советуют пользоваться оптимизированными наследниками QAbstractItemModel!
Записан
_Vitaliy_
Гость
« Ответ #19 : Октябрь 10, 2008, 17:29 »

спасибо за подсказку, будем пробовать, как сделаю (при наличии времени) обязательно отпишу, может еще кому сгодиться  Подмигивающий
Записан
_Vitaliy_
Гость
« Ответ #20 : Январь 31, 2009, 17:46 »

Доброго времени суток всем.
Наконец-то добрался до кьютов и разобрался наконец с QTableWidget. Поэтому отвечу сам себе  Подмигивающий

Код
C++ (Qt)
void MainWindow::OpenFile()
{
QString fileName = QFileDialog::getOpenFileName(this);
 
QFile file (fileName);
if (file.open(QIODevice::ReadOnly))
       {
              QTextStream stream(&file);
              stream.setCodec("CP-866");
int RowC=0; // kol-vo strok
while (!stream.atEnd())
       {
               stream.readLine();
               RowC++;
       }
 
stream.seek(0);//Go to begin of file
 
QTableWidget* tbl = new QTableWidget;
 
QStringList fields;
QString str1 = stream.readLine(); //chtenie stroki
QString str2 = stream.readLine(); //chtenie stroki
QString str3 = stream.readLine(); //chtenie stroki
QString str4 = stream.readLine(); //chtenie stroki
fields = str4.split(",");
int f = fields.size();
 
tbl->setColumnCount(f);
tbl->setRowCount(RowC-4);
tbl->setHorizontalHeaderLabels(fields);
 
QProgressDialog* pprd =
new QProgressDialog(tr("Progressing the data..."), tr("&Cancel"), 0, RowC,this);
pprd->setModal(true);  // ustanovka modalnosti okna
pprd->setMinimumDuration(0);
pprd->setWindowTitle("Please Wait");
 
QTime timer(0,0,0,0);
QTime tim(0,0,0,0);
timer.start();
 
RowC = 0;
 
while (!stream.atEnd())
{
  QString str = stream.readLine(); //chtenie stroki
  str = str.simplified();  //ubiraet pustie probeli v stroke
  fields = str.split(' ');
       for (int i=0; i<16; ++i)
       {
            QString fff = fields.at(i);
            QTableWidgetItem *item = new QTableWidgetItem;
            item->setText(fff);
            tbl->setItem(RowC, i, item);
       }
   ++RowC;
   pprd->setValue(RowC) ;  // progress
       if (pprd->wasCanceled()) break;
   qApp->processEvents(); // chtobi prilozhenie ne zavisalo
}
   if (stream.status() != QTextStream::Ok)
               {
                       qDebug() << "Ошибка чтения файла";
               }
   file.close();
 
   tim = tim.addMSecs(timer.elapsed());
       this->setWindowTitle(QString(tim.toString("m:s:z")));
 
       delete pprd; //unichtozhenie okna  QProgressDialog
 
   tbl->show();
       } // if fileopen
 
}


При этом время открытия файла в 10000 строк порядка 7-8 секунд. Код не идеален но работоспособен. Спасибо всем кто подсказывал.
Модератору предлагаю перенести ветку в раздел для новичков, там ей самое место.
Будем считать что тема закрыта.
Записан
Dendy
Гость
« Ответ #21 : Январь 31, 2009, 18:08 »

Раздел для новичков? Ну что вы, не стоит рисковать неокрепшей психикой юных программистов. Предлагаю поместить код в раздел "Комната пыток" и принудительно показывать тем кто нарушает правила форума.
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #22 : Январь 31, 2009, 19:43 »

я сотню раз уже писал, что QStandardItemModel медленная и для больших объёмов данных тролли советуют пользоваться оптимизированными наследниками QAbstractItemModel!
Как насчет создание раздела: "Грабли" или "Грабли Qt" или "Туда не ходи, снег башка попадет...."?
Имхо много полезнее будет, чем "я сотню раз уже писал"...
Я тока сегодня 2 темы под это дело присмотрел: эту и по производительности гиф анимации.
Что скажете?
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.154 секунд. Запросов: 22.