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. 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^^
-
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 demQMainWindow
) 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:
- Ein ParentWidget ( z.B. das CentralWidget von QMainWindow ), egal was, hauptsache QWidget.
- 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
- "Child-"Widgets ( in meinem Beispiel die QLabel ) dem Layout per ->addWidget hinzufügen.
- 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.
-
@It0101
Habs jetzt hinbekommen. Allerdings klappt das mit unserem tollen, schon bestehendem Programm irgendwie nicht, da wird ein neues Fenster einfach darüber erstellt. Naja, da muss ich wohl hier mal nachfragen und hoffen, dass der Ersteller nicht nur in Rente ist sondern auch noch lebt..
Trotzdem vielen Dank, hat mir schonmal weitergeholfen.
-
@bla1027
Glückwunsch. Etwas mehr Übung und die nächsten Probleme lösen sich von allein. QT ist eigentlich größtenteils pflegeleicht.