kostenloser Webspace werbefrei: lima-city


QListWidget items von einem zum anderen übertragen

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    g****e

    heyho
    ich hoff mal ihr könnt mir helfen, ich hab jetzt seit über 3 stunden kein ergebnis und schon alles durch...
    ich hab 2 QListWidget's und einen button. wenn auf den button gedrückt wird sollen die selected items von der einen listbox in die andere übertragen werden.

    das ganze soll mit MEHREREN gleichzeitg gehen. ich bin leider laborgebunden an QT 4.4.1, aber da gibts bestimmt auch eine lösung, hoffe ich.

    folgendes steht hier noch: ich hab aber schon nahezu alles probiert:

    QList<QListWidgetItem*> *selected_specList = new QList<QListWidgetItem*>;
    	*selected_specList = ui.tab2_list_spectra->selectedItems();
    
    	for (QList<QListWidgetItem*>::iterator it = selected_specList->begin(); it != selected_specList->end(); ++it) {
    		ui.tab2_list_spectra->removeItemWidget(*it);
    		ui.tab2_light_list->addItem(*it);
    	}


    foreach(QListWidgetItem *item,ui.tab2_list_spectra->selectedItems() ){
    		ui.tab2_list_spectra->removeItemWidget(item);
    		ui.tab2_light_list->addItem(item);
    	}


    foreach(QListWidgetItem *item,ui.tab2_list_spectra->selectedItems() ){
    		ui.tab2_list_spectra->removeItemWidget(ui.tab2_list_spectra->item( ui.tab2_list_spectra->row(item) ) );
    		ui.tab2_light_list->addItem(item);
    	}


    und noch einiges mehr...

    kann mir da vllt jemand helfen? ich hab einfach keine idee mehr.
    passieren tut nichts. die funktion wird richtig aufgerufen bei buttonclick (alles schon untersucht) und ich kann auch per ->addItem( QString ) innerhalb der funktion dinge hinzufügen. aber nicht so wies soll in den obigen codesampels... es wird nichts gelöscht und nichts hinzugefügt, der compiler gibt aber auch keine fehler aus... ich hab einfach keine idee mehr
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. everydaynormalguy

    everydaynormalguy hat kostenlosen Webspace.

    Hi, würd ich so machen:

    void MainWindow::on_pushButton_clicked()
    {
        for(int i = 0; i<ui->tab2_list_spectra->model()->rowCount(); i++)
        {
            if(ui->tab2_list_spectra->item(i)->isSelected())
            {
                ui->tab2_light_list->addItem(ui->tab2_list_spectra->item(i)->text());
                ui->tab2_list_spectra->model()->removeRow(i);
                i--;
            }
        }
    }

    mfg
  4. Autor dieses Themas

    g****e

    werd ich mal ausprobieren.

    kannst du das vlt noch mit worten spicken? dies model() kenn ich garnicht und find es in der doc auch nicht so auf anhieb. was bedeutet das?
    und hättest du ne idee warum meines denn falsch ist? vom syntax her ists vollkommen richtig, nur eben von der funktionweise nich :(
  5. Ein Model verwendet man normalerweise mit QListView. Da QListWidget von QListView abgeleitet ist, könnte es auch verwendbar sein, ob es tatsächlich funktioniert, musst du ausprobieren (siehe Code von everydaynormalguy).

    Wenn du mehr darüber wissen willst, dann solltest du wissen dass es u.a. diese weit verbreiteten Ansätze gibt:

    1) Model / View Programming (wird bei QListView verwendet)
    2) Itembased Widgets (z.B. QListWidget)

    Wie auch immer, es gibt wohl noch unzählige andere Lösungen, z.B.:

    QList<QListWidgetItem *> myselectedItems = ui->tab2_list_spectra->selectedItems( );
    for (int i = 0; i < ui->tab2_list_spectra->selectedItems( ).size( ); i++)
    {
       // Liste wird immer kürzer, weil man ja Items removed. Also immer das Item an erster Stelle nehmen:
       QListWidgetItem *item = myselectedItems.at(0); 
       // Zeile bestimmen, in dem das Item zu finden ist:
       int row = ui->tab2_list_spectra->row( item );
       // Remove das Item aus der Liste:
       ui->tab2_ist_spectra->takeItem( row );
       // Füge das Item in die andere Liste:
       ui->tab2_light_list->addItem( item );
    }


    Falls, das nicht funktioniert, ich hab da noch einige andere Ideen... Müsste auch kürzer gehen, da müsste ich aber noch mal gucken...

    grüßle tangoal

    ps: qt documentation schadet nie! einzige voraussetzung: Englischkenntnisse;-)
  6. Autor dieses Themas

    g****e

    ich arbeite mit der QT documentation^^ das englisch ist kein problem. nur bin ich total verzweifelt weil meine lösungen doch richtig sind oder nicht? oder sehe ich das falsch? oder bin ich zu blöd?
    aber danke, wenn es nicht klappt schreib ich dich an^^

    edit: die erste baut müll, die nimmt das selctede und noch ein paar unselected
    und die zweite funktioniert immer nur mit einem, aber nicht mit mehreren

    Beitrag zuletzt geändert: 9.2.2011 13:01:12 von ggamee
  7. ja, probier mal meinen Code aus, hatte keine Zeit den zu testen...

    zu deinen Codes:

    QList<QListWidgetItem*> *selected_specList = new QList<QListWidgetItem*>;
    	*selected_specList = ui.tab2_list_spectra->selectedItems();
    Sollte man nicht so programmieren. Es reicht wenn du schreibst:
    QList<QListWidgetItem*> selected_specList;
    	selected_specList = ui.tab2_list_spectra->selectedItems();
    Wenn du den Speicher so anforderst, darfst du nicht vergessen diesen wieder mit delete freizugeben, wenn du ihn nicht mehr brauchst! Außerdem könnte es auch noch einige andere unliebsame Effekte haben. Also mach es so wie ich es dir gerade gezeigt habe:-)


    ui.tab2_list_spectra

    ui ist normalerweise ein Zeiger. Ich denke nicht, dass dein Compiler das so kompiliert ohne zu murren. Versuch es mal mit dem Pfeil-Operator -> anstelle von ..

    Achso, jetzt habe ich deinen Fehler gesehen. Das Problem hatte ich auch mal. Blöderweise geht das nicht auf den ersten Blick aus der Qt documentation hervor, und eigentlich auch nicht auf dem zweiten :-) Erst wenn man damit einwenig herumexperimentiert hat, kommt man darauf.
    Pass auf: der Befehl removeItemWidget kann nur sinnvoll angewendet werden, wenn man den Befehl setItemWidget vorher verwendet hat. Somit ist es möglich jedem einzelnen Item ein Widget zuzuordnen, mit dem dessen Daten angezeigt werden sollen. Versuch es mal mit den Befehlen aus meinem Quellcode (also erst den Index des Items herausfinden, dann über die takeItem-Methode das Item herauslöschen).

    Viele Grüße

    Beitrag zuletzt geändert: 9.2.2011 19:21:58 von tangoal
  8. Autor dieses Themas

    g****e

    da muss man auch erstmal drauf kommen 0.0
    danke =)

    stimmt, an die speicherlecks habich garnichmehr gedacht, danke für die erinnerung. werd ich mich direkt dran halten!
    das mit dem ui.blah mach ich, weil mein vorgänger das schon so gemacht hat. ich erweitere im labor ein programm welches schon ziehmlich groß ist, und da steht alles mit ui. drin gemacht. daher hatte ich das benutzt. aber stimmt, wenn ich zuhause am QtCreator spiele mach ich das immer mit nem pfeil. aber nen murren gibt er mir nicht aus, muss ich dich enttäuschen^^ (hier im labor Eclipse mit Qt-Integration)

    danke für die hilfe, nu kanns weitergehen =)

    Edit: der pfeil -> gibt nurnoch fehler aus. der pfeil geht also in diesem scope. also wenn ich ui-> schreibe. der fehler ist:
    error: base operand of `->' has non-pointer type


    ist wie gesagt nicht von mir vorgeschrieben, das hat nen proff vorher geschrieben

    Beitrag zuletzt geändert: 10.2.2011 10:24:46 von ggamee
  9. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!