[C/C++] [Qt] Language Editor

Dieses Thema im Forum "Projekte / Codes" wurde erstellt von Rushh0ur, 11. Oktober 2010 .

Schlagworte:
  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
     
  2. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.