Seite 1 von 1

buttons per random vertauschen

Verfasst: 10. November 2010 14:14
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

Verfasst: 10. November 2010 17:06
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.

Verfasst: 10. November 2010 17:06
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";
    }
}