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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сохранение и загрузка в tableWidget?  (Прочитано 6890 раз)
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();
}
« Последнее редактирование: Ноября 02, 2009, 13:45 от pastor » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5877


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Ноября 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());
 
Это, конечно, не очень хороший код, но он наглядный и простой.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
MaraNesk
Гость
« Ответ #2 : Ноября 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());

}
Записан
BRE
Гость
« Ответ #3 : Ноября 03, 2009, 12:13 »

А ты item'ы в tableWidget устанавливаешь?
Что то типа этого делаешь ui->tableWidget->setItem(i, j, item)?
Проверь что возвращает item(i, j):
Код
C++ (Qt)
Q_ASSERT( ui->tableWidget->item(i, j) );
 
Записан
MaraNesk
Гость
« Ответ #4 : Ноября 03, 2009, 12:49 »

в креаторе в tableWidget добавлено 3 строки и 3 колонки поидее значит items созданы (при компиляции видны и принимают данные ввода)
а Q_ASSERT ругается на рантайм с++ Ща скачаю другой дистр с этим что то не удалось дебаг подружить
Записан
BRE
Гость
« Ответ #5 : Ноября 03, 2009, 12:53 »

в креаторе в tableWidget добавлено 3 строки и 3 колонки поидее значит items созданы (при компиляции видны и принимают данные ввода)
Ничего это не значит.
Если ты данные ввел, для той ячейки item создался. Все остальные пустые. Поэтому метод item(i, j) возвращает 0.
Либо при создании таблицы устанавливай все итемы руками (setItem) или при сохранении проверяй, что возвращает item(i, j) и если это 0 - записывай пустую строку.
Записан
MaraNesk
Гость
« Ответ #6 : Ноября 03, 2009, 14:09 »

Спасибо точно если заполнены то нормально все проходит  В замешательстве
Записан
MaraNesk
Гость
« Ответ #7 : Ноября 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));
  }
  }
}
Записан
BRE
Гость
« Ответ #8 : Ноября 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 ) );
    }
}
}
« Последнее редактирование: Ноября 05, 2009, 11:49 от BRE » Записан
MaraNesk
Гость
« Ответ #9 : Ноября 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)
« Последнее редактирование: Ноября 05, 2009, 11:47 от MaraNesk » Записан
BRE
Гость
« Ответ #10 : Ноября 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 ) );
    }
}
}
Записан
MaraNesk
Гость
« Ответ #11 : Ноября 05, 2009, 12:06 »

Большое спасибо заработало!
А интересно как сделать криптованный ini файл (типа в блокноте абракадабра). Смотрю в сторону iniCodec но там токо работа с символами.
Записан
BRE
Гость
« Ответ #12 : Ноября 05, 2009, 12:19 »

Посмотри на:
Format QSettings::registerFormat ( const QString & extension, ReadFunc readFunc, WriteFunc writeFunc, Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive )   [static]

Ты сможешь зарегистрировать свои функции чтения/записи и сделать в них все что захочешь.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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