QT4 Weniger Schreib-Arbeit mit UI file

Code-Schnippsel, oder Tipps und Tricks, die einem beim Programmieren mit Qt helfen können.
Antworten
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

QT4 Weniger Schreib-Arbeit mit UI file

Beitrag von patrik08 »

Wenn man eine datenbank oder nur die user , einstellung ... oder sonst irgenwelche variable abspeichern muss.... ist eben so ein UI file purer luxus.. und man muss viel weniger schreibarbeit leisten..

Die meisten dinge sind sowieso in einem QLineEdit oder QComboBox abgespeichert .. sicher geht es auch mit check box ...

Aber um Zeit zu sparen gebe ich den objekt name im designer bereist den gewunschten variable name den ich eben brauche...

Ziel ist es so eine xml datei zu haben ...
um jederzeit zu lesen & abzuspeichern im user home dir mit einem punkt davor ... auf linux chmod 0600

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?>
<setting xmlns:cms="http://www.pulitzer.ch/2005/PuliCMS/1.0">
<mail_server>cG9zdGEuc3dpc3NlLmNo</mail_server>
<mail_user>Y2l6LmNo</mail_user>
<mail_pass>MjRnYXR0aTI0</mail_pass>
<pref_browser>Z3Nnc2Rmc2Rmc2RzZHNzZHNkc2RzZGZzZHNzc3Nm</pref_browser>
<imex_server>cHBrLmdv</imex_server>
<imex_user>YWZhZmFmYWZkc2Rm</imex_user>
<imex_pass>YWZhZmFmYWZhZg==</imex_pass>
<pref_style_photo>R2lhbGxv</pref_style_photo>
<pref_language>SW5nbGVzZQ==</pref_language>
</setting>
Fuer den mench lesbar aber nicht begreifbar!
da alles encodeBase64 codiert ist ... tabulator "\n" und alle komische zeichen die xml verweigert gehen wie & oder den html "&nbsp;" nicht verloren beim decodieren ist alles wieder da....

Also machen wir die QLineEdit , QComboBox ecc um die einstellung zu haben... bereits im designer....

im constructor bereiten wir je element ein QLineEdit QStringList und eine
QList<QLineEdit *> textList; qlist von den objekten namen & reale objekte die asprechbar sind.....
darauf geben wir eine slot drauf fuer alle .... einzelne elemente alle die gleiche slot...

Code: Alles auswählen


Setting_Gui::Setting_Gui( QWidget* parent )
	: QDialog( parent )
{
    setupUi( this );
    qlineconfigs.clear();  /* QStringList */
    qboxsconfigs.clear();  /* QStringList */
    setWindowTitle(tr("Settaggio & Preferenze"));
    textList= this->findChildren<QLineEdit *>();
    boxList= this->findChildren<QComboBox *>();
    /* QList<QLineEdit*> textList = qFindChildren<QLineEdit*> ( this );  */
    for (int i=0;i<textList.size();i++){
    connect(textList[i], SIGNAL(textChanged(const QString&)),this, SLOT(WakeUp()));
    } 
    for (int x=0;x<boxList.size();x++){
    connect(boxList[x], SIGNAL(currentIndexChanged(const QString&)),this, SLOT(WakeUp()));
    } 
    connect(okButton, SIGNAL(clicked()), this , SLOT(acceptconfig()));
    if (is_file(APPLICATION_SETTING)) {
    ReadConfig();
    }
     
}
nun lesen wir beim laden den xml file um die QLineEdit , QComboBox wieder aufzufullen.....

Code: Alles auswählen

void Setting_Gui::ReadConfig()
{
    QString configwget = APPLICATION_SETTING;
    QFile xmlfile(configwget);
    if(!xmlfile.open( QIODevice::ReadOnly ) ) {
     ErrorConfig("");
    }
    QString errorStr, obname, inhalt;
    int errorLine;
    int errorColumn;
    
    QDomDocument doc("http://www.pulitzer.ch/2005/PuliCMS/1.0"); 
     if (!doc.setContent(&xmlfile,true, &errorStr, &errorLine, &errorColumn)) {
         QString error = (QString("Parse error at line %1, column %2:\n%3")
         .arg(errorLine)
         .arg(errorColumn)
         .arg(errorStr) );
        ErrorConfig(error);
     xmlfile.close();
     } 
    QDomElement root = doc.documentElement();
    if( root.tagName() != "setting" ) {
    ErrorConfig("");
    }
    QDomNode n = root.firstChild();
    while( !n.isNull() )
    {
        QDomElement e = n.toElement();
        if( !e.isNull() )
        {
                       for (int i=0;i<textList.size();i++){
                       obname =QString(textList[i]->objectName());
                         if( e.tagName() == obname ) {
                           textList[i]->setText(decodeBase64(e.text()));
                         }
                       }
                       for (int x=0;x<boxList.size();x++){
                       obname =QString(boxList[x]->objectName());  
                           if( e.tagName() == obname ) {
                            inhalt = decodeBase64(e.text());
                                 int summ = boxList[x]->count();
                                 for (int i=0;i<summ;i++){
                                    QString value = boxList[x]->itemText(i);
                                    if (inhalt == value) {
                                    boxList[x]->setCurrentIndex(i);
                                    }
                                }
                           }
                       }
         n = n.nextSibling();
        } 
    }
   xmlfile.close();
}
Alle einstellung oder variablen gehen wieder an seinem platz && die QComboBox sind aktiv was der user wunscht ....

nun gibt es eine aenderung im text oder combobox dir variablen und die slot arbeitet.

Code: Alles auswählen

/* read objektname and value setting & put to qstringlist */
void Setting_Gui::WakeUp()
{
    QString txtw, compare, obname; 
    qDebug() << "###  grab name xxxxx ";
    qlineconfigs.clear();
    qboxsconfigs.clear();
    for (int i=0;i<textList.size();i++){
        txtw = textList[i]->text();
        compare = fulltrim(txtw);
        obname =QString(textList[i]->objectName());
        qlineconfigs.append("<"+obname+">"+encodeBase64(compare)+"</"+obname+">"); /* register name & value of qlinedit*/
        if (obname.startsWith("pref_")) {   /* space allowed yes */
        continue;
        }
        if (txtw != compare) {
          textList[i]->setText(compare);
          QMessageBox::warning( this, tr( "Text Field Error" ), tr( "Is not possibel write \"%1\" Space on field %2").arg( txtw , QString(textList[i]->objectName()) )); 
        }
    } 
    for (int x=0;x<boxList.size();x++){
      obname =QString(boxList[x]->objectName());  
      txtw = boxList[x]->itemText(boxList[x]->currentIndex());
      qboxsconfigs.append("<"+obname+">"+encodeBase64(txtw)+"</"+obname+">"); /* register name & value of QComboBox */
    }
}

es werden die objekte eingelesen validiert und eine QStringList wird aufgefullt mit den zeilen die denn zur abspeichern im xml gehen...
mit dem base64 encode alles flach auf eine zeile ... obwohl die variable vielleicht auf 5 zeilen ist ...

der user macht das fenster der einstellung oder datenbank zu .... fertig editieren... und der destruktor geht los... und speichert die einstellung...

Code: Alles auswählen

/* write configuration from grab qstringlist */
void Setting_Gui::Generate_User_Pref()
{
   QString xfile ="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
           xfile.append("<setting xmlns:cms=\"http://www.pulitzer.ch/2005/PuliCMS/1.0\">\n");
           xfile.append(qlineconfigs.join("\n")); /* qlinedit vars  save */
           xfile.append("\n");
           xfile.append(qboxsconfigs.join("\n")); /* QComboBox vars save */
           xfile.append("\n</setting>\n");
           file_put_contents(APPLICATION_SETTING,xfile);
}

Wollen wir eine neue variable? einfach im ui file mit designer
ein neuen QLineEdit , QComboBox mit dem objektname als unsere variable namen ... speichern und fertig... der code liest ja bereits die objektnamen..... und speichert dazu noch sein wert...
Der objektnamen vom label kann ja uns wurscht sein...

die neben funktionen... die mei mir in eine statische libs sind zusammen mit sqlite libs ... sind einfach noch ein paar funktionen dazukommen zu sqlite3 libs.... (die ohne classname::)

Code: Alles auswählen


void Setting_Gui::ErrorConfig(QString t)
{
QMessageBox::warning( this, tr( "File Error! & XML Error!" ), tr( "Not possibel to open/read config file!\n" )+t+"\nFile:\n"+APPLICATION_SETTING ); 
}

QString encodeBase64( QString xml )
{
    QByteArray text;
    text.append(xml);
    return text.toBase64();
}
QString decodeBase64( QString xml )
{
    QByteArray xcode("");;
    xcode.append(xml);
    QByteArray precode(QByteArray::fromBase64(xcode));
    QString notetxt = precode.data();
    return notetxt;
}

QString fulltrim(QString cutestrings)
{
    QStringList list = cutestrings.split(" ");
    QString newpola = list.join("");
return newpola.trimmed();
}


Im grunde genommen koenten wir so auch eine datenbank einlesen feldernamen=objektnamen ... anstatt ins xml geht es zur db retour beim speichern.. Ein db formular shon in stellung und ordnung .... wo sich praktisch automatisch speichert...
Antworten