
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.246] |
![]() |
|
Сообщ.
#1
,
|
|
|
Имеется QVector объектов структуры record:
![]() ![]() struct record { QTableWidgetItem artist; QTableWidgetItem album; QTableWidgetItem genre; QTableWidgetItem year; /*....*/ }; То есть по-сути в моем случае эта структура выступают рядом QTableWidget. Я читаю данные из файла. Записи имеют вид: Цитата artist;album;genre;year artist2;album2;genre2;year Так как я не понял каким образом у QTextStream выставить свой разделитель, я считываю построчно и затем разбиваю строку по разделителю. В итоге получился такой код (надеюсь не совсем жуткий:): ![]() ![]() 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 и все нормально отображалось. В чем проблема? |
Сообщ.
#2
,
|
|
|
когда пишешь:
![]() ![]() ui.recordsTable->setItem( ui.recordsTable->rowCount() - 1, 0, &m_records.back().artist ); ты передаешь указатель на QTableWidgetItem. Данные у тебя хранятся в векторе. Фича вектора в том, что он ресайзится при добавлении элементов. Если ты в TableWidget передал указатель, а затем вектор ресайзился и изменил место хранения данных, то указатели будут неверны. Вообще если брать из примеров, то тебе нужно делать примерно так: ![]() ![]() 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 ); |
Сообщ.
#3
,
|
|
|
sploid Бли-и-ин, я даже не подумал про перераспределение памяти ... Просто все было слишком точно - всегда первая запись исчезала. Попробую по-другому как-нибудь
![]() PS. Да, в конструкторе приложения зарезервил памяти в векторе и все нормально стало. Нужно думать что-нибудь другое. QVector<recor*> наверное Ну так и решил ... В векторе храню указатели, а в коде пара изменений ![]() ![]() 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 ); //и т.д. |
Сообщ.
#4
,
|
|
|
Xenon_Sk все равно не верно. Если ты вызовешь ui.recordsTable->clear или ui.recordsTable->clearContents для таблицы, то он попытается удалить твои итемы, что не правильно. НЕ НУЖНО ХРАНИТЬ QTableWidgetItem, храни QString, а QTableWidgetItem создавай динамически.
|
Сообщ.
#5
,
|
|
|
sploid Понял
|