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>
da alles encodeBase64 codiert ist ... tabulator "\n" und alle komische zeichen die xml verweigert gehen wie & oder den html " " 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();
}
}
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();
}
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 */
}
}
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);
}
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...