Widget automatisch erstellen lassen



  • 1

    58



  • @bla1027 sagte in Widget automatisch erstellen lassen:

    Hoffe das ist verständlich

    Geht so... Weiß aber auch nicht so wirklich, wo dein Problem liegt. Du kannst Widgets natürlich auch dynamisch erstellen, du brauchst auch überhaupt keine ui Datei. Kannst auch problemlos kombinieren, wie du willst.



  • Also ich kann dir sagen, dass ich QT komplett ohne den Designer ( ui-Files ) programmiere. Wenn man einigermaßen flott mit der Tastatur ist und weiß was man tut, ist das zeitlich kein großer Unterschied.

    10 Labels untereinander:

    auto v = new QVBoxLayout( this );
    for ( unsigned i  = 0; i < 10; ++i )
    {
        auto w = new QLabel();
        w->setFixedSize( 200, 21 );
        w->setText( "Test" );
        v->addWidget( w );
    }
    


  • @bla1027 sagte in Widget automatisch erstellen lassen:

    Hoffe das ist verständlich, falls nicht schiebe ich es einfach mal auf die Hitze:D

    Es fehlt die wichtigste Information: Welches GUI-Toolkit nutzt Du überhaupt?



  • Ich nehme mal stark an, dass er den QTCreator nutzt, aber das ist irrelevant, weil er ja gerade eine Möglichkeit sucht, ohne Designer klarzukommen 😉



  • @It0101 sagte in Widget automatisch erstellen lassen:

    Wenn man einigermaßen flott mit der Tastatur ist und weiß was man tut, ist das zeitlich kein großer Unterschied.

    Das ist nicht der wichtigste Grund. Es geht mehr um Kapselung/sauberen Code. Code, der GUI zusammenstöpselt, ist meist völlig uninteressant. Wenn die GUI dynamisch ist, dann ja. Sonst in eine ui Datei packen und nicht weiter beachten.



  • @Mechanics sagte in Widget automatisch erstellen lassen:

    @It0101 sagte in Widget automatisch erstellen lassen:

    Wenn man einigermaßen flott mit der Tastatur ist und weiß was man tut, ist das zeitlich kein großer Unterschied.

    Das ist nicht der wichtigste Grund.

    Ich meinte das nicht als "Grund". Ich höre nur öfter "ja das geht mit dem Designer aber viel schneller", und lasse das einfach als "Nachteil" nicht gelten. Weil der Nachteil, wenn überhaupt existent, minimal ist.
    Als Grund hast du mit der Kapselung natürlich recht. Der Code ist einfach ordentlicher und intuitiver, finde ich zumindest.



  • @It0101 sagte in Widget automatisch erstellen lassen:

    Ich nehme mal stark an, dass er den QTCreator nutzt, aber das ist irrelevant, weil er ja gerade eine Möglichkeit sucht, ohne Designer klarzukommen 😉

    Gerade wenn man auf das GUI-Deisgnprogramm verzichtet wird es interessant was für ein Toolkit man verwendet.

    Änderung: falsche Zitat korrigiert.



  • @It0101 Genau sowas suche ich:D ob das im Designer gemacht wird oder nicht ist erstmal irrelevant. Ich kann es eben meines Wissens nicht im Designer/ der Ui-Datei programmieren, da diese immer beim neukompilieren alle Änderungen die von Hand eingestragen wurden löscht. Ich weiß jetzt nicht, ob ich in die andere Datei einfach Code schreiben kann und der dann trotzdem in die bisherig vorhandene Anzeige eingebettet wird, das teste ich jetzt. Vielen Dank und ich hoffe das mit Deinem Beispiel funktioniert direkt:D



  • @bla1027 sagte in Widget automatisch erstellen lassen:

    @It0101 Genau sowas suche ich:D ob das im Designer gemacht wird oder nicht ist erstmal irrelevant. Ich kann es eben meines Wissens nicht im Designer/ der Ui-Datei programmieren, da diese immer beim neukompilieren alle Änderungen die von Hand eingestragen wurden löscht. Ich weiß jetzt nicht, ob ich in die andere Datei einfach Code schreiben kann und der dann trotzdem in die bisherig vorhandene Anzeige eingebettet wird, das teste ich jetzt. Vielen Dank und ich hoffe das mit Deinem Beispiel funktioniert direkt:D

    Das Beispiel ist zwar nur so aus dem Arm geschüttelt, aber sollte halbwegs funktionieren, wenn du z.B. in einer QMainWindow-Ableitung oder QWidget-Ableitung arbeitest oder etwas ähnlichem ( wegen des 'this' im Ctr von QVBoxLayout ). Ansonsten gehört in den Konstruktoraufruf vom Layout halt das übergeordnete Widget.

    Kannst ja mal etwas rumprobieren und dann hier mal kurz zeigen was du gebaut hast, falls noch Probleme auftauchen.

    Eines musst du aber Bedenken: Da das Design nicht mehr in deinem Designer-Tool existiert, musst du es in deinem Kopf haben, d.h. etwas Vorstellungskraft ist schon von Vorteil 😉



  • @It0101 Also bei mir zickt der Compiler schon allein wegen dem auto Schlüsselwort rum.
    Aber ja ich teste mal ein bisschen rum^^



  • @It0101

    Das Beispiel ist zwar nur so aus dem Arm geschüttelt, aber sollte halbwegs funktionieren, wenn du z.B. in einer QMainWindow-Ableitung oder QWidget-Ableitung arbeitest oder etwas ähnlichem ( wegen des 'this' im Ctr von QVBoxLayout ). Ansonsten gehört in den Konstruktoraufruf vom Layout halt das übergeordnete Widget.

    Was genau muss ich in den Ctr eintragen? Ich schreibe das jetzt in "formstatus.cpp", heißt ja da muss stehen

    v= new QFrame(formStatus);
    

    Das erzeugt aber den Fehler " error C2275: 'formStatus': Ungültige Verwendung dieses Typs als Ausdruck".

    Wenn ich in der Ui-Datei arbeite wird "formStatusUi" eingetragen. Wenn ich das aber jetzt auch mache, kommt auch der Fehler "error C2275: 'Ui::formStatusUi': Ungültige Verwendung dieses Typs als Ausdruck". Heißt ja soviel wie ich kann Widgets nicht in der .cpp-Datei initialisieren oderwie? Oder gebe ich da nur das falsche an?



  • @bla1027
    QFrame erfordert im Konstruktor ein QWidget, daher solltest du rausfinden was "formStatus" für ein Typ ist.

    "auto" ist ein Schlüsselwort, welches im C++11-Standard dazu kam. Du musst vermutlich das hier

    QMAKE_CXXFLAGS += -std=gnu++11
    

    zu deinem ".pro"-File hinzufügen.



  • @It0101 Also wenn ich zB das hier mache

    for ( int i  = 0; i < 2; ++i )
    {
    	int x = i*50;
    
    	line0->setGeometry(QRect(61, 60+x, 31, 33));
    	line0->setStyleSheet(QString::fromUtf8("color: rgb(100,100,200);"));
    
    }
    

    Bekomme ich eine Anzeige von einem QFrame. Allerdings hätte ich in diesem Fall ja gerne zwei, einer über dem anderen. Wie ist das möglich? Ich muss scheinbar die Widgets im Ui-File initialisieren etc, ansonsten werden sie mir gar nicht angezeigt.



  • Den passenden Code hat @It0101 dir doch schon gezeigt.



  • @Th69 Wie oben bereits erwähnt, geht der nicht. Unter anderem weil addWidget kein Element von Qframe ist.



  • Du mußt ja auch das neu erstellte QFrame-Objekt einem Container (oder direkt dem QMainWindow) hinzufügen.



  • @Th69 was heißt das konkret?:D Sorry, bin tatsächlich doch noch ein blutiger Anfänger wie mir scheint



  • @Th69 @It0101 Ich möchte eine stackedbarchart schreiben, wie es sie in qt5.x gibt. Allerdings schaffe ich es nicht irgendwelche Dateien zu includen, entweder bin ich zu blöd oder die Server hier bei der Arbeit lassen das nicht zu. Vielleicht hilft das ja zum Verständnis für was ich die Schleife zum Zeichnen mehrerer Frames brauche..



  • Dieser Beitrag wurde gelöscht!


  • @bla1027 sagte in Widget automatisch erstellen lassen:

    Bekomme ich eine Anzeige von einem QFrame. Allerdings hätte ich in diesem Fall ja gerne zwei, einer über dem anderen. Wie ist das möglich? Ich muss scheinbar die Widgets im Ui-File initialisieren etc, ansonsten werden sie mir gar nicht angezeigt.

    Grundsätzlich musst du im UI-File gar nichts machen.

    Ich nutze folgende Vorgehensweise beim erzeugen von (dynamischen) Widgets/Objekten:

    1. Ein ParentWidget ( z.B. das CentralWidget von QMainWindow ), egal was, hauptsache QWidget.
    2. Dann Ein Layout, welches im Konstruktor das ParentWidget übernimmt:
    • horizontale Anordnung von Widgets: QHBoxLayout
    • vertikale Anordnung von Widgets: QVBoxLayout
    • gitterförmige Anordnung von Widget: QGridLayout
    1. "Child-"Widgets ( in meinem Beispiel die QLabel ) dem Layout per ->addWidget hinzufügen.
    2. setGeometry brauchst du eigentlich gar nicht, wenn du mit den Layouts arbeitest. Vorteil der Layouts: Du bist unempfindlich gegenüber Resize vom Fenster, oder gegenüber unsichtbar gemachten Widgets. Wenn du von den zehn Labels aus meinem Beispiel das erste(oberste) unsichtbar machst, dann rutschen die 9 weiteren nach oben, und wenn du das erste wieder sichtbar machst, rutschen die wieder nach unten. Wenn du mit setGeometry arbeitest, sind die Positionen fix.

    Zum anderen: das ist kein Drecksforum. Es kennt sich nur nicht jeder mit allem aus und man erkennt sehr schnell wer wirklich helfen will. Die paar Trolle kannst du einfach getrost ignorieren.
    Zum zweiten: QT ist am Anfang schwierig, aber wenn du das Prinzip erstmal verstanden hast, bietet es vielseitige Möglichkeiten und geht flott von der Hand.
    Man merkt schon dass du Anfänger bist, aber wenn du dran bleibst, wirst du schnell Fortschritte machen. Nur nicht entmutigen lassen.


Anmelden zum Antworten