[solved]elemente dynamisch erstellen und speichern

Alles rund um die Programmierung mit Qt
Antworten
Aenni
Beiträge: 79
Registriert: 15. Juli 2010 22:29

[solved]elemente dynamisch erstellen und speichern

Beitrag von Aenni »

Hallo liebe Qt-Experten,

ich habe ein kleines Problem und suche somit euren Rat.

Ich möchte dynamisch Elemente erstellen und diese dann Speichern.
Das heisst: Das Ertsellen der Elemente (Buttons and so on...) ist kein Thema. Nur sind diese natürlich nach einem Programm beenden und neustarten wieder weg - sofern ich diese nicht in irgendeiner Form speichere.

Meine Frage wäre jetzt, was wäre ein geschickter Weg diese Elemente zu speichern-und diese somit beim Neustarten des Programmes wieder verfuegbar sind.

Eine Ini Datei erzeugen, und diese beim Start Laden ? Leider bin ich diesbezüglich etwas Ratlos. Würde mich über Tipps freuen.

Danke

Gruss !
Zuletzt geändert von Aenni am 21. Januar 2011 15:54, insgesamt 3-mal geändert.
dontinelli
Beiträge: 146
Registriert: 22. September 2006 20:53

Beitrag von dontinelli »

Was für Elemente möchtest du speichern?
I.d.R. führt nichts daran vorbei, beim Beenden des Programms die Konfiguration der Elemente zu speichern und sie beim Neustart neu zu erstellen und sie mit den gespeicherten Einstellungen zu konfigurieren.
Wie du die Einstellungen speicherst (ini/xml/sql/eigenes dateiformat) kommt darauf an, welche funktionalität du benötigst.
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag von padreigh »

Du könntest QSettings dafür nehmen - nur weiss ich nicht in wie weit das Sinn macht - du müsstest ja neben den Knöpfen auch die Connections usw. speichern - klingt irgendwie nach komischem Design (für mich).
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
Aenni
Beiträge: 79
Registriert: 15. Juli 2010 22:29

Beitrag von Aenni »

derzeit brauche ich eig. nur dynamische RadioButtons.

Ich wollte dass der user eine möglichkeit hat, radio buttons nach eigenem ermeßen zu erstellen.

Aber es gibt bestimmt dafuer design technisch einen eleganteren Weg.(wie so oft;) Nur komme ich derzeit nicht drauf.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Du solltest dir mal überlegen was du überhautpt willst, momentan hört sich das mehr nach einem Nachbau vom Designer an.

Ansonsten gibt es für deine Rechtschreibung bestimmt einen design technisch eleganteren Weg...
Aenni
Beiträge: 79
Registriert: 15. Juli 2010 22:29

Beitrag von Aenni »

upsala hat geschrieben:Du solltest dir mal überlegen was du überhautpt willst, momentan hört sich das mehr nach einem Nachbau vom Designer an.

Ansonsten gibt es für deine Rechtschreibung bestimmt einen design technisch eleganteren Weg...
ein nachbau des Designers wollte ich nicht, aber danke fuer deine Hinweise!
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag von padreigh »

Sag doch mal was der User da machen will ... vielleicht kann dir dann jemand helfen - sozusagen das ZIEL, nicht was du dir vorstellst wies gehen könnte ...
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
Aenni
Beiträge: 79
Registriert: 15. Juli 2010 22:29

Beitrag von Aenni »

ich habe derzeit 5 radio buttons die eine Art Rubrik darstellen. Jetzt gibt es zu jeder Rubrik Infos, die der user ändern kann. Was er aber nicht kann, ist eine neue Rubrik hinzufuegen.

Jetzt waere es schick, wenn der User neue Rubriken hinzufuegen kann.

so far ty.
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag von padreigh »

Jupp es geht ... zB so:

Code: Alles auswählen

#include <QtGui>
#include "widget.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

Code: Alles auswählen

#ifndef WIDGET_H
#define WIDGET_H

#include <QtGui/QWidget>
#include <QSettings>

class QSettings;
class QButtonGroup;
class QVBoxLayout;
class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void addOwnRadio();
    void removeOwnRadio();

private:
    void addOwn(const QString & text);

private:
    QSettings    * m_settings;
    QButtonGroup * m_bg;
    QVBoxLayout  * m_vlayOWN;

};

#endif // WIDGET_H

Code: Alles auswählen

#include "widget.h"

#include <QApplication>
#include <QtGui>

Widget::Widget(QWidget *parent) :
        QWidget(parent),
        m_settings(new QSettings(QSettings::IniFormat,
                                 QSettings::UserScope,
                                 "QSettingsTest",
                                 "qSettingsTestApp")),
        m_bg(0),
        m_vlayOWN(0)
{
    QVBoxLayout * vlay = new QVBoxLayout(this);
    QVBoxLayout * vlayFIX = new QVBoxLayout;

    m_bg = new QButtonGroup(this);
    for(int i=0; i<5; ++i)
    {
        QRadioButton * but =  new QRadioButton("fixRB "+QString::number(i),this);
        vlayFIX->addWidget(but);
        m_bg->addButton(but);
    }
    m_bg->setExclusive(true);
    m_bg->buttons().first()->setChecked(true);

    QToolButton * tbAdd = new QToolButton(this);
    tbAdd->setText("add RadioButton");
    tbAdd->setObjectName("addRadioButton");
    connect(tbAdd,SIGNAL(clicked()),this,SLOT(addOwnRadio()));

    QToolButton * tbRemove = new QToolButton(this);
    tbRemove->setText("remove RadioButton");
    tbRemove->setObjectName("remRadioButton");
    connect(tbRemove,SIGNAL(clicked()),this,SLOT(removeOwnRadio()));

    m_vlayOWN= new QVBoxLayout;

    while(! m_settings->group().isEmpty()) m_settings->endGroup();
    m_settings->beginGroup("ownRadioButtonNames");
    foreach( QString s, m_settings->allKeys())
    {
        addOwn(s);
    }
    m_settings->endGroup();


    vlayFIX->addLayout(m_vlayOWN);

    vlay->addLayout(vlayFIX);
    vlay->addStretch(1);

    vlay->addWidget(tbAdd);
    vlay->addWidget(tbRemove);
}

Widget::~Widget()
{
}

void Widget::addOwn(const QString & text)
{
    QRadioButton * cb = new QRadioButton(text,this);
    cb->setObjectName("OWN");
    m_vlayOWN->addWidget(cb);
    m_bg->addButton(cb);
}

void Widget::addOwnRadio()
{
    QString title = QInputDialog::getText(this, tr("Input title"),tr("Whats the new options name?"));
    if (title.isNull()) return;

    // disallow double entries
    foreach (QRadioButton * but, findChildren<QRadioButton*>("OWN"))
    {
        if (but->text() == title)
        {
            QMessageBox::information(this,tr("Info"),tr("Already there."));
            return;
        }
    }
    addOwn(title);

    while(! m_settings->group().isEmpty()) m_settings->endGroup();
    m_settings->beginGroup("ownRadioButtonNames");
    m_settings->setValue(title,QVariant());
}

void Widget::removeOwnRadio()
{
    QList<QRadioButton*> owns = findChildren<QRadioButton*>("OWN");
    if (owns.isEmpty())
    {
        QMessageBox::information(this,tr("Info"),tr("Nothing to remove."));
        return;
    }

    QStringList rbListNames;
    rbListNames << "";
    foreach (QRadioButton *rb, owns) rbListNames << rb->text();

    QString title = QInputDialog::getItem(this,tr("Choose title"),tr("Remove which one?"),rbListNames,0,false);

    foreach (QRadioButton *rb, owns)
    {
        if (rb->text() == title)
        {
            rb->close();
            rb->deleteLater();
            break;
        }
    }

    while(! m_settings->group().isEmpty()) m_settings->endGroup();
    m_settings->beginGroup("ownRadioButtonNames");
    m_settings->remove(title);
}
Du schuldest mir 1 Stunde coden (von Projekterstellung bis Posting ;) aber immerhin hab ich nun 2 mehr QKlassen mal benutzt :P
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
Aenni
Beiträge: 79
Registriert: 15. Juli 2010 22:29

Beitrag von Aenni »

wow ein großes dankeschoen an dich padreigh!!!
Antworten