buttons per random vertauschen

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

buttons per random vertauschen

Beitrag von Aenni »

Hallo liebe QT Experten,

folgendes Problem habe ich wieder mal :(

Ich habe ein Dialog welcher 4 buttons ein paar textedits und labels enthaelt.

Nun möchte ich, dass wenn einer der Buttons geklickt wurde, die buttons in einer random anordnung wieder erscheinen. Das heisst, wo bt1 war soll bt2 sein wo bt 2 war soll bt4 sein, quasy eine interne random vertauschung der buttons.

Ich habe versucht die Buttons in ein GridLayout zu packen, und dann 4 layouts zu definieren die quasy eine unterschiedliche "addWidget" reihenfolge darstellen.

Code: Alles auswählen

    //im Konstruktor des Dialogs:
    //
    QVBoxLayout *buttonLayout2 = new QVBoxLayout;
    buttonLayout2->addWidget(ui->btEins);
    buttonLayout2->addWidget(ui->btZwei);
    buttonLayout2->addWidget(ui->btDrei);
    buttonLayout2->addWidget(ui->btVier);

    QVBoxLayout *buttonLayout3 = new QVBoxLayout;
    buttonLayout3->addWidget(ui->btDrei);
    buttonLayout3->addWidget(ui->btEins);
    buttonLayout3->addWidget(ui->btVier);
    buttonLayout3->addWidget(ui->btZwei);

    ui->gridLayout->addLayout(buttonLayout2,3,3);
Aber irgendwie funktioniert das nicht wie erwartet.
Ich kann im Konstruktor ein addlayout fuer gridlayout vornehmen, dann zeigt er mir auch die buttons an wie ich Sie definiert habe (im layout) -
Leider bin ich aber nicht in der lage dass ich "on btEins clicked" ein neues Layout von Gridlayout zuweisen kann ? In der Doku habe ich gelesen, dass ich das alte Layout erst löschen muss, mit delete ui.gridLayout.layout(); hatte ich aber leider kein Erfolg .

Kann ich ueberhaupt das Mainframe (den Dialog) einzeln updaten ? das heisst, kann ich da theoretisch ueberhaupt sagen, setze dem "gridlayout_1" ein neues Layout zu Grunde ?


Gibt es vllt. eine ganze andere Lösung auf die ich noch nicht gekommen bin ?

Sorry für meine etwas verwirrte Darstellung aber so siehts derzeit in meinem Kopf aus :(

Merci im Voraus

Gruss

Aenni
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Ich bin mir nicht sicher, ob man ein QWidget überhaupt mehreren Layouts hinzufügen kann. Aber ich würde das FlowLayout-Example umbauen.
Aenni
Beiträge: 79
Registriert: 15. Juli 2010 22:29

Beitrag von Aenni »

so nach einer pause habe ich einen Weg gefunden der mri das erfuellt was ich möchte.

ich geh ueber ein array und aendere die labels und funktionalitaet des buttons darueber...

Hier mein beispiel, bestimmt nicht schön aber es funktioniert soweit ;)
form.hpp

Code: Alles auswählen

namespace Ui {
    class Form;
}

class Form : public QWidget
{
    Q_OBJECT

public:
    explicit Form(QWidget *parent = 0);
    ~Form();

private:
    Ui::Form *ui;

    int myIntArr[4];
    QString myStringArr[4];

    QString ActStr(int iNr);

private slots:
    void on_btShuffle_clicked();
    void clickedBt();
};

form.cpp

Code: Alles auswählen

Form::Form(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form)
{
    ui->setupUi(this);

    connect(ui->btChoose1,SIGNAL(clicked()),this,SLOT(clickedBt()));
    connect(ui->btChoose2,SIGNAL(clicked()),this,SLOT(clickedBt()));
    connect(ui->btChoose3,SIGNAL(clicked()),this,SLOT(clickedBt()));
    connect(ui->btChoose4,SIGNAL(clicked()),this,SLOT(clickedBt()));


    for (int x = 0; x < sizeof(myIntArr)/sizeof(myIntArr[0]); x++){
        myIntArr[x] = 0;
        myStringArr[x] = "";
    }


}

Form::~Form()
{
    delete ui;
}

void Form::on_btShuffle_clicked()
{
    myIntArr[0] = 3;
    myIntArr[1] = 1;
    myIntArr[2] = 4;
    myIntArr[3] = 2;

    for ( int x = 0; x <  sizeof(myIntArr)/sizeof(myIntArr[0]); x++){
        int y = x+1; 
        QString str= "btChoose" + QString::number(y);
        QPushButton *setIt = this->findChild<QPushButton*>(str);
        setIt->setText(ActStr(myIntArr[x]));
    }
}

void Form::clickedBt(){
    int Nr;
    QObject *bla = sender();
    QString bla2 = bla->objectName();
    bla2 = bla2.remove(0,bla2.length()-1);

    Nr = bla2.toInt();

}

QString Form::ActStr(int iNr){
    switch (iNr) {
    case 1:
        return "blubb";
    case 2:
        return "bla";
    case 3:
        return "doh";
    case 4:
        return "dim";
    }
}
Antworten