PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Qtable Copy/Paste



gyros'nmaronen
05-05-2006, 08:16
Moin, Moin

Ich bins schon wieder mit meinem Tabellenproblem. Also ich hab jetzt die Copy/Paste-Funktion in Angriff genommen(allerdings erstmal ohne QClipboard, also nur in der Tablle möglich). Kopieren funktioniert ohne Probleme. Aber das Einfügen bereitet mir noch Probleme. Wenn ich den Text einfüge, schreibt er in meine Zellen komische Striche. Manchmal aber auch nicht. Dieses tut er aber auch nur wenn ich in der ersten Spalte den Text einfügen will. Außerdem stürtzt mein Programm ab wenn ich zuviel Text kopieren will. Ich hab mich auch am csv Format orientiert (danke an anda_skoa für den Tip), nur das ich kein "\" benutze sonder "/". Weil er den Backslash als einzelnes Zeichen nicht in den String schreibt.

Meine beiden Fuktionen:

Copy:


void MyMainWindow::copy(void)
{
_text = "";
_text.reserve(20000);
for (int i = 0; i <= _ptable->numCols(); i++)
{
for (int j = 0; j <= _ptable->numRows(); j++)
{
if (_ptable->isSelected(j,i) == TRUE)
{
_text = _text + _ptable->text(j,i) + ";";
}

}
if (_text == "")
continue;
else _text = _text + "/";
}
_text.sqeeze();
_label5->setText(_text);
}




Paste:


void MyMainWindow::paste ( void )
{
int status = 0;

for (int i = _ptable->currentColumn(); i <= _ptable->numCols(); i++)
{
for (int j = _ptable->currentRow(); j <= _ptable->numRows(); j++)
{
for ( int x = status; x <= _text.capacity(); x++ )
{
_ch[x] = _text.at(x);
if (_ch[x] == ";" || _ch[x] == "/")
{
status++;
// status= x;
break;
}

_text1 = _text1 + _ch[x];

status= x;
}
if (_ch[x] == "/")
{
status--;
break;
}
status++;
_ptable->setText( j, i, _text1);
_text1 = "";
}
status++;
}

}


Ich weiß ich geh euch ganz schön aufn Sack damit, aber ich steh noch ziemlich am Anfang was die Programmierung angeht.
Danke für eure Hilfe und Geduld.

MFG gyros

gyros'nmaronen
05-05-2006, 11:18
Hab meine paste-Funktion noch ein wenig verbessert.
In eine Zelle kopiert er aber immer noch irgendwelche Striche.
Wenn ich mehrere Zellen kopieren will stürzt mein Programm immer noch ab.


void MyMainWindow::paste ( void )
{
int status = 0;

for (int i = _ptable->currentColumn(); i <= _ptable->numCols(); i++)
{
if ( i >= _ptable->numCols())
break;
for (int j = _ptable->currentRow(); j <= _ptable->numRows(); j++)
{
for ( int x = status; x <= _text.capacity(); x++ )
{
_ch[x] = _text.at(x);
if (_ch[x] == ";" || _ch[x] == "/")
break;

_text1 = _text1 + _ch[x];
status= x;
_ptable->setText( j, i, _text1);
}
if (_ch[x] == "/")
{
status++;
break;
}
_text1 = "";
x++;
status= x;
}

}

}

anda_skoa
05-05-2006, 15:57
Am Besten du trennst den String mit QStringList::split zuerst mal nach Zeilen.

Dann in einer Schleife über diese Liste und parallel über die Rows.
Bei jedem Element der Liste diesen String nach Spalten splitten, dann diese Unterliste parallel zu den Spalten iterieren.

Übrigens würde ich an deiner Stelle als Zeilentrenner "\n" nehmen, also Newline.

Ciao,
_

gyros'nmaronen
09-05-2006, 07:59
Hab dann doch noch den Algorithmus so optimiert das er jetzt funktionier. Habe aber kein String::List benutzt. Es funktioniert auch mit einem ganz normalen String. Aber mit der String::List wäre es natürlich eine elegantere Lösung. Newline hab ich auch noch eingefügt. Funktioniert tadellos!!! Übrigens kann ich jetzt auch in und von anderen Applikationen copy/pasten. Ist wirklich n'geiles Forum. Kann man nur weiter empfehlen. Danke...

MFG gyros