#1 11. Oktober 2010 Zuletzt von einem Moderator bearbeitet: 14. April 2017 [Qt] Language Editor Hallo Progger, beschäftige mich seit einigen Tagen mit Qt, hab nun einen Language Editor geschrieben mit dem man "Sprachdateien" erstellen und bearbeiten kann, diese Sprachdateien können schliesslich für eigene (Qt-)Projekte verwendet werden um diese Mehrsprachig zu machen oder what auch ever. Im wesentlichen zeigt der Sourcecode: - wie man Dateien erstellt, beschreibt und ausliest - wie man mit XML Daten arbeitet - wie man Daten komprimiert - für was man Checksummen benutzen kann - wie man mit Listen arbeitet Sourcecodeausschnitt der Speichern und Laden Routinen: Code: void MainWindow::LoadFromFile() { QFile qFile( filename); if( !qFile.open( QIODevice::ReadOnly) ) { ui->statusBar->showMessage(text[3], 2000); return; } /// read file data QByteArray idx = qFile.read(3); QByteArray content = qFile.read(qFile.size()-3-2); QByteArray hash = qFile.read(2); QByteArray hash_calc; qint16 icrc = qChecksum(content.data(), content.length()); hash_calc.append((char*)&icrc, 2); qFile.close(); if ((hash == hash_calc) && (idx == QString("ZLF").toAscii())) { ui->lineEditItemName->clear(); ui->listWidgetItems->clear(); ui->textEditValue->clear(); /// decompress and process content QByteArray content_dec = qUncompress(content); QDomDocument document( "ZeroLoaderLanguageFile" ); QDomElement head, child; QListWidgetItem *item; document.setContent(QString(content_dec)); head = document.documentElement(); /// load info content child = head.firstChild().toElement(); for (int i=0; i<child.attributes().count(); i++) { item = new QListWidgetItem("NFO_" + child.attributes().item(i).nodeName()); item->setData(Qt::UserRole, QString(child.attributes().item(i).nodeValue())); ui->listWidgetItems->addItem(item); } /// load item content head = head.lastChild().toElement(); child = head.firstChild().toElement(); while (!child.isNull()) { item = new QListWidgetItem(child.attributes().item(0).nodeName()); item->setData(Qt::UserRole, QString(child.attributes().item(0).nodeValue())); ui->listWidgetItems->addItem(item); child = child.nextSibling().toElement(); } ui->statusBar->showMessage(text[5], 2000); } else ui->statusBar->showMessage(text[6], 2000); } void MainWindow::SaveToFile() { QDomDocument document( "ZeroLoaderLanguageFile" ); QDomElement head, child, item; QList<QListWidgetItem*> list; head = document.createElement( "content" ); // create info content child = document.createElement( "info" ); list = ui->listWidgetItems->findItems("NFO_.+", Qt::MatchRegExp); if (!list.isEmpty()) { for (int i=0; i<list.count(); i++) { child.setAttribute(list[i]->text().mid(4), list[i]->data((Qt::UserRole)).toString()); } } head.appendChild(child); // create items content child = document.createElement( "itemlist" ); document.appendChild(head); if (ui->listWidgetItems->count()) { for (int i=0; i<ui->listWidgetItems->count(); i++) { if (!list.contains(ui->listWidgetItems->item(i))) { item = document.createElement( "item" ); item.setAttribute(ui->listWidgetItems->item(i)->text(), ui->listWidgetItems->item(i)->data((Qt::UserRole)).toString()); child.appendChild(item); } } } head.appendChild(child); document.appendChild(head); QFile qFile( filename); if( !qFile.open( QIODevice::WriteOnly) ) { ui->statusBar->showMessage(text[3], 2000); return; } QByteArray content = qCompress(document.toString().toAscii(), 9); QByteArray idx = QString("ZLF").toAscii(); QByteArray hash; qint16 icrc = qChecksum(content.data(), content.length()); hash.append((char*)&icrc, 2); /// write data to file qFile.write(idx); qFile.write(content); qFile.write(hash); qFile.close(); ui->statusBar->showMessage(text[4], 2000); } Und noch einmal das komplette Projekt: Language Editor Src Struktur der Sprachdatei: Code: Bytes 0..2: Datei ID ("ZLF") Bytes 3..EOF-2: Compriemierte XML Datan Bytes EOF-2..EOF: CRC16 Checksumme der Comprimierten Daten *EOF = Ende der Datei Hoffe hiermit finden einige Programmierer den start in Qt. Mfg Rushh0ur + Multi-Zitat Zitieren