Russian Qt Forum

Qt => Общие вопросы => Тема начата: MaraNesk от Ноябрь 02, 2009, 10:49



Название: Сохранение и загрузка в tableWidget?
Отправлено: MaraNesk от Ноябрь 02, 2009, 10:49
Собственно а как правильно это делать? Нужно сохранять данные введенные в tableWidget  и загружать
конкретных примеров хоцца
застрял с этим кодом в creatore просто вылетает при компиляции

Код
C++ (Qt)
void MainWindow::writeset()
{
   AppFileName=qApp->applicationDirPath()+"\\rms.ini";
   QSettings set(AppFileName,QSettings::IniFormat);
   set.setValue("ED",ui->lineEdit->text());
   set.setValue("ed2",ui->lineEdit_2->text());
   set.beginWriteArray("Table",2);
   for (int i=0;i<ui->tableWidget->rowCount();i++)
   {
       for (int j=0;j<ui->tableWidget->columnCount();j++)
       {
          set.setArrayIndex(i);
           set.setValue("it",ui->tableWidget->item(i,j)->text());
           //set.setValue("col",j);
       }
   }
   set.endArray();
}


Название: Re: Сохранение и загрузка в tableWidget?
Отправлено: Пантер от Ноябрь 02, 2009, 12:36
Я обычно вот так сохраняю:
Код
C++ (Qt)
settings.setValue("Table/ColumnCount", table->columnCount();
settings.setValue("Table/RowCount", table->rowCount();
for (int i = 0; i < table->rowCount(); i++)
 for (int j = 0; j < table->columnCount(); j++)
   settings.setValue(QString("Table/Row_%1_Column_%2").arg(i).arg(j), table->item(i, j)->text());
 
Это, конечно, не очень хороший код, но он наглядный и простой.


Название: Re: Сохранение и загрузка в tableWidget?
Отправлено: MaraNesk от Ноябрь 03, 2009, 12:05
Спасибо но чтото неработает можно подробнее.
Проект компилится, при закрытии происходит ошибка
что то про сегментацию грит
Starting D:\Qt\Projects\testsave\debug\testsave.exe...
D:\Qt\Projects\testsave\debug\testsave.exe exited with code -1073741819
Код:
void MainWindow::writeset()
{
    AppFileName=qApp->applicationDirPath()+"\\rms.ini";
    QSettings set(AppFileName,QSettings::IniFormat);
    set.setValue("ED",ui->lineEdit->text());
    set.setValue("ed2",ui->lineEdit_2->text());
 
    set.setValue("Table/ColumnCount", ui->tableWidget->columnCount());
    set.setValue("Table/RowCount", ui->tableWidget->rowCount());
    for (int i = 0; i < ui->tableWidget->rowCount(); i++)
      for (int j = 0; j < ui->tableWidget->columnCount(); j++)
        set.setValue(QString("Table/Row_%1_Column_%2").arg(i).arg(j), ui->tableWidget->item(i, j)->text());

}


Название: Re: Сохранение и загрузка в tableWidget?
Отправлено: BRE от Ноябрь 03, 2009, 12:13
А ты item'ы в tableWidget устанавливаешь?
Что то типа этого делаешь ui->tableWidget->setItem(i, j, item)?
Проверь что возвращает item(i, j):
Код
C++ (Qt)
Q_ASSERT( ui->tableWidget->item(i, j) );
 


Название: Re: Сохранение и загрузка в tableWidget?
Отправлено: MaraNesk от Ноябрь 03, 2009, 12:49
в креаторе в tableWidget добавлено 3 строки и 3 колонки поидее значит items созданы (при компиляции видны и принимают данные ввода)
а Q_ASSERT ругается на рантайм с++ Ща скачаю другой дистр с этим что то не удалось дебаг подружить


Название: Re: Сохранение и загрузка в tableWidget?
Отправлено: BRE от Ноябрь 03, 2009, 12:53
в креаторе в tableWidget добавлено 3 строки и 3 колонки поидее значит items созданы (при компиляции видны и принимают данные ввода)
Ничего это не значит.
Если ты данные ввел, для той ячейки item создался. Все остальные пустые. Поэтому метод item(i, j) возвращает 0.
Либо при создании таблицы устанавливай все итемы руками (setItem) или при сохранении проверяй, что возвращает item(i, j) и если это 0 - записывай пустую строку.


Название: Re: Сохранение и загрузка в tableWidget?
Отправлено: MaraNesk от Ноябрь 03, 2009, 14:09
Спасибо точно если заполнены то нормально все проходит  :-\


Название: Re: Сохранение и загрузка в tableWidget?
Отправлено: MaraNesk от Ноябрь 05, 2009, 11:08
Опять туплю а как данные теперь прочитать  ???
Код:
void MainWindow::readset()
{

    AppFileName=qApp->applicationDirPath()+"\\rms.ini";
    QSettings set(AppFileName,QSettings::IniFormat);
ui->lineEdit->setText(set.value("ED","no").toString());
ui->lineEdit_2->setText(set.value("ed2","NO2").toString());
for (int i = 0; i < ui->tableWidget->rowCount(); i++)
{
  for (int j = 0; j < ui->tableWidget->columnCount(); j++)
    {
     
    //ui->tableWidget->setItem(i,j,QTableWidgetItem(set.value(QString("Table/Row_%1_Column_%2").arg(i).arg(j)),0));
    ui->tableWidget->item(i,j)->setData(0,(set.value(QString("Table/Row_%1_Column_%2").arg(i).arg(j)),0));
  }
  }
}


Название: Re: Сохранение и загрузка в tableWidget?
Отправлено: BRE от Ноябрь 05, 2009, 11:18
Там где то toString нужно добавить.
Код:
void MainWindow::readset()
{
...
for (int i = 0; i < ui->tableWidget->rowCount(); i++)
{
  for (int j = 0; j < ui->tableWidget->columnCount(); j++)
    {
    ui->tableWidget->setItem( i, j, new QTableWidgetItem( set.value( QString("Table/Row_%1_Column_%2").arg(i).arg(j) ).toString(), 0 ) );
    }
}
}


Название: Re: Сохранение и загрузка в tableWidget?
Отправлено: MaraNesk от Ноябрь 05, 2009, 11:45
Спасибо что помогаешь  но
D:/Qt/Projects/testsave/mainwindow.cpp:47: error: no matching function for call to `QTableWidgetItem::QTableWidgetItem(QVariant, int)'
D:/Qt/Projects/testsave/../../4.6.0-beta1/include/QtGui/../../src/gui/itemviews/qtablewidget.h:89: note:                 QTableWidgetItem::QTableWidgetItem(const QString&, int)


Название: Re: Сохранение и загрузка в tableWidget?
Отправлено: BRE от Ноябрь 05, 2009, 11:50
Там где то toString нужно добавить.
Код:
void MainWindow::readset()
{
...
for (int i = 0; i < ui->tableWidget->rowCount(); i++)
{
  for (int j = 0; j < ui->tableWidget->columnCount(); j++)
    {
    ui->tableWidget->setItem( i, j, new QTableWidgetItem( set.value( QString("Table/Row_%1_Column_%2").arg(i).arg(j) ).toString(), 0 ) );
    }
}
}


Название: Re: Сохранение и загрузка в tableWidget?
Отправлено: MaraNesk от Ноябрь 05, 2009, 12:06
Большое спасибо заработало!
А интересно как сделать криптованный ini файл (типа в блокноте абракадабра). Смотрю в сторону iniCodec но там токо работа с символами.


Название: Re: Сохранение и загрузка в tableWidget?
Отправлено: BRE от Ноябрь 05, 2009, 12:19
Посмотри на:
Format QSettings::registerFormat ( const QString & extension, ReadFunc readFunc, WriteFunc writeFunc, Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive )   [static]

Ты сможешь зарегистрировать свои функции чтения/записи и сделать в них все что захочешь.