QTableWidget zeigt nur die 1. Zeile an

Alles rund um die Programmierung mit Qt
Antworten
july
Beiträge: 21
Registriert: 9. September 2010 13:19

QTableWidget zeigt nur die 1. Zeile an

Beitrag von july »

Hallo,
ich hab ein Problem beim Abspeichern der Tabelle in eine Datei und danach wieder Auslesen der Tabelle. Vielleich können Sie mir helfen. Ich bekomme nur eine Zeile zurück, obwohl rowCount() und columnCount() mir die richtige Ergebnisse liefern.

void MainWindow::tSaveDemoHandler() {

fileName = ui.tFilename->text();
if (fileName.isEmpty()) {
ui.tErrorlabel->setText("<font color=red>No file Name specified</font>");
return;
}
if (!fileName.contains(".txt")) {
fileName.append(".txt");
}
fileName.insert(0, "demo/");
QFile file(fileName);
if(file.exists()){
file.remove();

}
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
ui.tErrorlabel->setText(
"<font color=red>The file couldn't be open.\nPlease try again.</font>");
return;
}

QDataStream out(&file);

int max_row = ui.tableWidget->rowCount(); //seltsames Verhalten
int max_column = ui.tableWidget->columnCount();
QString defItem = "a";
for (int irow = 0; irow <max_row; irow++) {
for (int icol = 0; icol < max_column; icol++) {
QTableWidgetItem *pItem = ui.tableWidget->item(irow, icol);

if (pItem) {
out << pItem->text(); // text inklusive ","
} else {
out << defItem;
}
}
out << "\r\n"; // Zeilenvorschub
}
file.close();

}


void MainWindow::tPlayDemoHandler() {

fileName = ui.tFilename->text();
if (fileName.isEmpty()) {
ui.tErrorlabel->setText("<font color=red>No file Name specified</font>");
return;
}
if (!fileName.contains(".txt")) {
fileName.append(".txt");
}
fileName.insert(0, "demo/");
QFile file(fileName);

if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
ui.tErrorlabel->setText(
"<font color=red>The file couldn't be open.\nPlease try again.</font>");
return;
}
tDeleteallHandler();
QDataStream in(&file);
QString item;
int irow = 0;

while (!in.atEnd()) {
for (int icol = 0; icol < 7; icol++) {
in >> item;
if (item.compare("a") != 0) {
QTableWidgetItem *pItem = new QTableWidgetItem(item);
ui.tableWidget->setItem(irow, icol, pItem);
}
}
irow++;
}
file.close();

}
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag von kater »

Das Verhalten ist bei mir gleich.
Ich glaub der Fehler liegt irgendwo bei QDataStream.
Es gibt dafür ein Beispiel in der Doku

Code: Alles auswählen

Example (write binary data to a stream):

 QFile file("file.dat");
 file.open(QIODevice::WriteOnly);
 QDataStream out(&file);   // we will serialize the data into the file
 out << "the answer is";   // serialize a string
 out << (qint32)42;        // serialize an integer
Example (read binary data from a stream):

 QFile file("file.dat");
 file.open(QIODevice::ReadOnly);
 QDataStream in(&file);    // read the data serialized from the file
 QString str;
 qint32 a;
 in >> str >> a; 
Welches aber schon nicht funktioniert. Er schreibt die Daten richtig in die Datei, ausgelesen werden aber nur nicht druckbare Zeichen. Ausser bei der Zahl. Da funktioniert es.

// edit
Hab den Fehler. Man liest ein QString rein, also muss man auch ein QString schreiben

Code: Alles auswählen

 out << QString("the answer is");
Kann man wer schauen ob das wirklich ein Fehler in der Doku ist?

Den zweiten Fehler hab ich auch. Entferne in der Funktion tSaveDemoHandler() diese Zeile

Code: Alles auswählen

out << "\r\n"; // Zeilenvorschub
Dann geht es, die Textdatei hat natürlich keine Zeilenumbrüche mehr. Also entweder beim Einlesen die Zeilenumbrüche extra behandeln oder vllt. mal QTextStream versuchen.
Antworten