Werte an eine Funktion übergeben

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • hey das mit


    Quellcode

    1. QVector<QWidget*> vector;
    2. for (int i=0; i<=40; i++) {
    3. vector.push_back(new QDoubleSpinBox);
    4. vector[i]->setValue(0.0);
    5. qDebug() << vector[i]->value();
    6. }


    funktioniert nicht, es kommen zwei Fehlermeldungen (die aber nicht stimmen).


    Quellcode

    1. TabDrei.cpp: In member function 'void TabDrei::send()':
    2. TabDrei.cpp:17: error: 'class QWidget' has no member named 'setValue'
    3. TabDrei.cpp:18: error: 'class QWidget' has no member named 'value'


    Oder liegt das an QVector??

    lg

    nicilo
  • Hallo,

    das liegt daran, das du das Template falsch definiert hast, was mehr oder weniger mein Fehler gewesen ist:

    Quellcode

    1. QVector<QDoubleSpinBox*> vector;
    2. for (int i=0; i<=40; i++) {
    3. vector.push_back(new QDoubleSpinBox);
    4. }


    Sollte gehen. So nun zu deiner PN: Das mit den Tabs ist an sich super Easy. Jedes Tab kann widgets halten. Sprich du baust dir Ein Widget zusammen, klatscht da deine SpinBoxren rein, und creierst dann damit das Tab. Du musst dir überlegen was du macht, Wenn du mit dem Designer arbeitest musst du nix Überladen, oder neu schreiben, da die Widgets schon exitieren. Du hast somit einen Klassen-Globalen zugriff darauf. Im Designer steht dann auch wie das Widget heißt. Wenn keins da ist einfach ein anlegen und richtig benennen (Darg&Drop). Wenn du das per hand schreiben willst, schau dir das mal an:

    Tab Dialog Example

    Und weil es so schön ist: QTabWidget

    Ich formuliere das mal so: Wenn man mit einem Designer arbeitet sollte man wirklich wissen was man macht. (Trolltech Docu zeigt wie es geht).
    Und man spart sich mit dem Designer erst Zeit und Arbeit wenn man weiß wie alles funktioniert und zusammenhängt.

    Was auch nicht schaden kann, ist wenn man sich hin und wieder nochmal Klassen in Plain C++ rein zieht. Da Qt eine Komplexe klassen Struktur hat.

    Das mit QVector etc... ist an sich nix anderes als Vector der STL nur das er mit Qt-Typen funktioniert.

    Da du in C++ fitt bist verweise ich dich mal ganz Frech auf die STL (Darauf bauen die Qt-Container auf, es schadet nicht wenn mal das Orginal sieht und wozu was gut ist.)

    STL

    QT kommt mit der vielen beispielen, hier ist mal eine schicke Übersicht: Qt Examples

    So ich hoffe das bringt dich wieder ein Schritt näher an dein Ziel.

    so long
    jd
    Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert, der letzte Netzknoten kommerzialisiert, die letzte Newsgroup moderiert wird, werdet Ihr merken, dass man mit Geld allein nicht programmieren kann.
  • danke für deine ausführliche Antwort.

    Ich habe da nur eines nicht verstanden. Was meinst du mit "und creierst dann damit das Tab". Ich habe ja in MainWindow meine TabWidget, und noch mal 3 separate Widgets. Ich kann kein Widget in einen Tab schieben (hab ich im designer versucht) Oder muss man das Code-mäßig machen??

    Das Beispiel mit dem Tab Dialog Widget hab ich mir gestern schon ausgedruckt. Das Problem dabei ist, dass da alles per hand (code) erstellt wird. Und das STL guck ich mir heute abend an.

    Ich schick dir mal die Bilder von meinem MainWindow und meiner Widgets.

    lg

    nicilo
    Bilder
    • qtDesigner.jpg

      336,65 kB, 1.137×2.306, 155 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von nicilo ()

  • Hallo,

    was du machen willst ist, Dynamische Widgets mit dem Designer zu kreieren. Das ist ein paradoxon. Das funktioniert so nicht. Was du mit dem Designer macht ist alles das was Statisch ist. Du scheinst noch ein kleines Problem zu haben, wie ein QTabWidget aufgebaut ist. Ich versuch das mal ganz Grob zu beschreiben.

    QTabWidget ist vom Typ QTabWidget und erbt von QWidget. Ein einzelner Tab ist ein QWidget. Das kann man im QDeigner wunderbar sehen: Qbject Inspector

    Also warum machst du für 3 Tabs 3 verschiedene *.ui files. Das sind 3 Klassen die wieder erben und von einander unabhänig sind. Es ist zwar möglich das so zu macht, aber nicht im sinne der Entwickler :)

    Also macht man das ganze in eine *.ui und den Rest mit Layouts. Normalerweise sollte jedes QWidget ein Layout haben. Wie das geht habe ich schon erklärt. Der Vorteil darin liegt, das alles in einer Klasse ist, so wie es eigentlich sein muss.

    Ich habe mal ein neues Dummy-Project gemacht, das zeigt wie es geht. Der erste Tab im QTabWidget heißt tab der 2. tab_2. Da jeder Tab schon ein QWidget hat brauche ich nur noch mit "->setLayout" alles rein klatschen. Mein Quellcode sollte das verdeutlichen:

    Quellcode

    1. void CMainWindow::setupTab1()
    2. {
    3. for (int i=0; i<=2; i++) {
    4. vector.push_back(new QDoubleSpinBox);
    5. }
    6. QVBoxLayout* vBoxLayout = new QVBoxLayout();
    7. for (vectorIterator = vector.begin(); vectorIterator != vector.end(); vectorIterator++) {
    8. vBoxLayout->addWidget(*vectorIterator);
    9. }
    10. tab->setLayout(vBoxLayout);
    11. }
    Alles anzeigen


    Hiermit klatsche ich dir alles in den ersten Tab rein (tab). Sieht zwar hässlich aus das es kracht aber das kann man mit den Layouts noch verfeinern.

    Anbei das komplette Projekt.

    so long
    jd
    Dateien
    • QTab.zip

      (2,41 kB, 177 mal heruntergeladen, zuletzt: )
    Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert, der letzte Netzknoten kommerzialisiert, die letzte Newsgroup moderiert wird, werdet Ihr merken, dass man mit Geld allein nicht programmieren kann.
  • Das kannst du nicht übergeben.

    wenn

    Quellcode

    1. void phaseplate(FFTW_REAL *bild,float g[],float lambda,float alpha,int dimx, int dimy);


    verlangt wird kannst nicht mit nem Vector ankommen :) dazu müsstest du die Funktion modifizieren.
    Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert, der letzte Netzknoten kommerzialisiert, die letzte Newsgroup moderiert wird, werdet Ihr merken, dass man mit Geld allein nicht programmieren kann.
  • hmm, du erstellst ja die SpinBoxes per hand (also per code) ich will das aber im designer machen.

    Wie soll ich denn z.B in setupTab1() meine methode save() reinschreiben??? Und wie soll ich dazu die connects erstellen, wenn ich save() oder load().. nicht habe??

    lg

    nicilo

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von nicilo ()

  • Was meinst du denn warum ich die SpinBox per Code erstelle? Das einfacher zu handhaben ist, im Designer macht das kein Sinn. Wenn du nen Load oder Save Button haben willst, musst du diese erstellen, und dann per Connect verbinden, so wie gehabt. Wenn du dann noch die Funktion modifizierst kannst du einfach einen Vector übergeben und kannst wunderbar und super easy mit so vielen Spinboxen arbeiten wie du willst. Aber jetzt mal ehrlich warum willst du die im Designer anlegen und nicht per hand? Das ist vollig egal nur das es per hand in dem Fall effizienter ist.
    Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert, der letzte Netzknoten kommerzialisiert, die letzte Newsgroup moderiert wird, werdet Ihr merken, dass man mit Geld allein nicht programmieren kann.
  • Naja die frage ist so nicht zu beantworten. Wenn 5 Spinboxen zusamm gehören und du machst 2 im Designer und 3 per hand, wo ist da der sinn? Und wenn was geändert werden muss ist das auch egal dazu gibts patches die man veröffentlichen kann. Ich empfehle dir mal das ganze noch genauer und strukturierter zu Planen, das scheint mir alles etwas durcheinander zu sein. Container wurden dazu erfunden mehrere Daten vom gleichen Typ zu verwalten und genau das habe ich dir gezeigt wie das geht. Und nimms mir nicht übel aber wenn wer was im Designer haben will, weil er kein Quellcode versteht, hat er eigentlich da nix verloren :) Neu kompilieren musste es eh...
    Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert, der letzte Netzknoten kommerzialisiert, die letzte Newsgroup moderiert wird, werdet Ihr merken, dass man mit Geld allein nicht programmieren kann.