На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела *nix / gcc / Eclipse / Qt / wxWidgets / GTK+
  • При создании темы ОБЯЗАТЕЛЬНО указывайте версию тулкита / библиотеки / компилятора.
  • Перед тем как задать вопрос, сформулируйте его правильно, чтобы вас могли понять.
  • Нарушение Правил может повлечь наказание со стороны модераторов.


Полезные ссылки:
user posted image Boost по-русски
user posted image Qt по-русски
Модераторы: Majestio
  
> Непонятни с QTableWidget
    Имеется QVector объектов структуры record:
    ExpandedWrap disabled
      struct record
      {
          QTableWidgetItem artist;
          QTableWidgetItem album;
          QTableWidgetItem genre;
          QTableWidgetItem year;
              /*....*/
      };

    То есть по-сути в моем случае эта структура выступают рядом QTableWidget.

    Я читаю данные из файла. Записи имеют вид:
    Цитата
    artist;album;genre;year
    artist2;album2;genre2;year


    Так как я не понял каким образом у QTextStream выставить свой разделитель, я считываю построчно и затем разбиваю строку по разделителю.
    В итоге получился такой код (надеюсь не совсем жуткий:):
    ExpandedWrap disabled
      void QtApp::on_loadButton_clicked()
      {
          QString file_path = QFileDialog::getOpenFileName(this, "Open File", "", "Text Files (*.txt);;All Files (*.*)");
          if ( file_path.isEmpty() ) return;
          QFile file( file_path );
          if ( !file.open(QIODevice::ReadOnly | QIODevice::Text) )
          {
              QMessageBox::critical(this, "Could not open file", "The File could not be opend");
              return;
          }
          while ( !file.atEnd() )
          {
              QString line = file.readLine();
              QStringList qList = line.split(QLatin1String(";"));
              if ( qList.size() < 4 )
              {
                  QMessageBox::critical(this, "Error", "Bad Record at line " + QString().setNum(m_records.size()) );
                  return;
              }
              m_records.push_back( record(qList.at(0), qList.at(1), qList.at(2), qList.at(3)) );
              ui.recordsTable->insertRow( ui.recordsTable->rowCount() );
              ui.recordsTable->setItem( ui.recordsTable->rowCount() - 1, 0, &m_records.back().artist );
              ui.recordsTable->setItem( ui.recordsTable->rowCount() - 1, 1, &m_records.back().album );
              ui.recordsTable->setItem( ui.recordsTable->rowCount() - 1, 2, &m_records.back().genre );
              ui.recordsTable->setItem( ui.recordsTable->rowCount() - 1, 3, &m_records.back().year );
          }
      }

    Здесь recordsTable тот самый QWidgetTable, m_records тот самый QVector.

    А проблема-то в чем заключается - все считывается, но почему-то первый ряд в таблице всегда пустой, а дальше идет все как положено. То есть первая как бы вносится, но ячейки пустые - вторая и последующие записи выводятся нормально. В векторе записи все на месте, да и раньше вместо QWidgetTable я юзал простые QLineEdit и все нормально отображалось.
    В чем проблема?
      когда пишешь:
      ExpandedWrap disabled
        ui.recordsTable->setItem( ui.recordsTable->rowCount() - 1, 0, &m_records.back().artist );

      ты передаешь указатель на QTableWidgetItem. Данные у тебя хранятся в векторе.
      Фича вектора в том, что он ресайзится при добавлении элементов.
      Если ты в TableWidget передал указатель, а затем вектор ресайзился и изменил место хранения данных, то указатели будут неверны.

      Вообще если брать из примеров, то тебе нужно делать примерно так:
      ExpandedWrap disabled
        struct record
        {
            QString artist;
            QString album;
            QString genre;
            QString year;
                /*....*/
        };
         
         
        ui.recordsTable->insertRow( ui.recordsTable->rowCount() );
        QTableWidgetItem *newItem = new QTableWidgetItem( m_records[ m_records.size( ) - 1].artist );
        ui.recordsTable->setItem( ui.recordsTable->rowCount() - 1, 0, newItem );
      Сообщение отредактировано: sploid -
        sploid Бли-и-ин, я даже не подумал про перераспределение памяти ... Просто все было слишком точно - всегда первая запись исчезала. Попробую по-другому как-нибудь :)
        PS. Да, в конструкторе приложения зарезервил памяти в векторе и все нормально стало. Нужно думать что-нибудь другое. QVector<recor*> наверное

        Ну так и решил ... В векторе храню указатели, а в коде пара изменений
        ExpandedWrap disabled
          m_records.push_back( new record(qList.at(0), qList.at(1), qList.at(2), qList.at(3)) );
          ui.recordsTable->insertRow( ui.recordsTable->rowCount() );
          ui.recordsTable->setItem( ui.recordsTable->rowCount() - 1, 0, &m_records.back()->artist );
          //и т.д.
        Сообщение отредактировано: Xenon_Sk -
          Xenon_Sk все равно не верно. Если ты вызовешь ui.recordsTable->clear или ui.recordsTable->clearContents для таблицы, то он попытается удалить твои итемы, что не правильно. НЕ НУЖНО ХРАНИТЬ QTableWidgetItem, храни QString, а QTableWidgetItem создавай динамически.
          Сообщение отредактировано: sploid -
            sploid Понял
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0326 ]   [ 16 queries used ]   [ Generated: 14.07.25, 08:56 GMT ]