PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dynamische Schriften etc...



Mat
19-11-2005, 02:23
Hallo,
ich habe eine GUI und diese wird für jedes widget mit setGeometry etc angelegt....
Jetzt ist meine Frage....kann ich irgendwie einfach alles so implementieren dass auch bei sich ändernder Bildschirmauflösung und auch bei anderen Schriftgrößen alles so bleibt ........?

Wie wird das gehandhabt ?

Danke euch!

Kirsche
19-11-2005, 10:11
Hallo Mat,

ja, das kannst du. Dazu benutzt man den Layoutmanager, indem man qlayout.h einbindet. Es gibt horizontale Layouts (QHBoxLayout), vertikale Layouts (QVBoxLayout) und Gitter (QGridLayout). Du kannst diese auch kombinieren, also mehrere horizontale anschließend in ein vertikales Layout stecken. Um Fenster einzufügen, benutzt du addWidget, für Layouts addLayout. Als parent gibst du allerdings immer das Fenster an, was darunter liegt, und nicht das Layout!

Der Vorteil von den Layouts ist, dass Qt die Aufteilung des Fensters selber regelt, also auch wenn sich die Schriftgröße ändert etc. Jedes Fenster erhält so viel Platz, wie es braucht. Abstände zum Rand und zu anderen Fenstern kannst du allerdings selber einstellen. Man kann auch Spacer einfügen, wenn man nicht möchte, dass der gesamte Platz genutzt wird, oder einen Stretch, wenn der Abstand z.B. zwischen zwei Buttons mitwachsen soll, wenn das Hauptfenster seine Größe ändert. Falls irgendein Fester eine minimale oder maximale Größe haben soll, kannst du das auch angeben. Das wird dann eingehalten, schränkt aber den Layoumanager ein.

Am Anfang ist es vielleicht etwas schwierig, den Überblick zu behalten, weil man die Layouts nicht sieht. Mal dir am besten deine Fenster auf ein Blatt Papier, zeichne die Layouts ein und implementiere sie dann. Oder probier das Ganze erst mal mit dem QT Designer aus.

Schöne Grüße,

anda_skoa
19-11-2005, 15:40
Ich schließ mich der Empfehlung, Qt Designer zu verwenden, an.

Ciao,
_

Mat
19-11-2005, 17:23
danke danke...
jetzt habe ich ein problem...

naja ich habe schon ziemlich viel an der GUI gebaut und es sind mehrere fenster jetzt...
aberbisher habe ich alles mit setGeometry gemacht.

Mist...jetzt werde ich wohl das gesamte Layout nochmal machen dürfen wegen QLayout und so oder ?!

Ist es denn so dass wenn ich z.B einen PushButton habe ja....
und jetzt zum Beispiel die Schriftgröße meines Systems überdimensional groß mache....also z.B auf 20
Bleibt dan mit QLayout der gesamte Text des Pushbuttons sichtbar ? ALso dehnt sich der Button dann aus ?
Weil so wie es jetzt ist wird der Text am ende einfach abgeschnitten....:(

Kann mir vielleicht jemand sagen was genau QSizePolicy macht ? Hier steht was von Längen/Weiten Definierung oder so.....
Könnte ich das hernehmen? Oder ist es einfach doch alles umzustellen?

Ja hmm qt designer kenne ich. Habe den zu Hilfe genommen aber was der mir ausspuckt istmir ein wenig zu eigensinnig....

och menno.......:(

Kirsche
20-11-2005, 12:21
Hallo Mat,

der Button dehnt sich dann so aus, dass die Schrift darauf passt. Natürlich nur, wenn du seine maximale Größe nicht kleiner eingestellt hast.
Was QSizePolicy macht, habe ich auch noch nicht herausgefunden ;)

Im Grunde genommen musst du nicht dein ganzes Programm neu machen. Du musst nur setGeometry herausnehmen und Layouts hinzufügen. Deine Fenster können vermutlich so bleiben, wie sie sind.

Du sollst auch nicht dein Programm mit dem Qt Designer erstellen, sondern einfach nur ein Gefühl für Layouts bekommen, z.B. wie Spacer etc. funktionieren.

Schöne Grüße,

anda_skoa
20-11-2005, 14:14
Ja hmm qt designer kenne ich. Habe den zu Hilfe genommen aber was der mir ausspuckt istmir ein wenig zu eigensinnig....


Inwiefern stört dich, welchen Code uic generiert?
Du mußt damit ja nicht arbeiten, du arbeitest im Normalfall ohnehin nur mit davon abgeleiteten Klassen.

CIao,
_

Mat
20-11-2005, 14:55
danke....
also wahrscheinlich habe ich bisher total falsch gearbeitet......und deswegen interessiert mich jetzt eure meinung dazu...

bisher habe ich mit dem qtdesigner meine oberfläche gebaut und dann die generierten Klassen einfach ergänzt mit code den ich den klassen gebraucht habe.....abgeleitet habe ich leider nicht so viel.
SOllte ich das in Zukunft machen?
@Kirsche...
naja eigentlich muss ich doch jetzt für jedes widget setGeometry rausnehmen udn dann in ein Layout packen. Das heißt ich muss für jedes widget neue Koordinaten eintragen da sie sich ja ab jetzt nur noch auf das layout beziehen--> das heißt VIIIIEL Arbeit .....

oder verstehe ich das jetzt falsch ????

anda_skoa
20-11-2005, 15:21
bisher habe ich mit dem qtdesigner meine oberfläche gebaut und dann die generierten Klassen einfach ergänzt mit code den ich den klassen gebraucht habe.....abgeleitet habe ich leider nicht so viel.
SOllte ich das in Zukunft machen?

Du kannst natrülich weiter die generierten Dateien ändern, du mußt halt damit rechnen das alles was du rein geschrieben hast, bei der nächsten Generation wieder weg ist.

Wäre mir persönlich zu mühsam, aber das ist natürlich jedem selbst überlassen.


Das heißt ich muss für jedes widget neue Koordinaten eintragen da sie sich ja ab jetzt nur noch auf das layout beziehen

Nein, keine Koordinaten. Das macht das Layout. Du setzt nur die Widgets in entsprechende Layouts hinein.
Bei einem BoxLayout entscheidet die Einfügreihenfolge über die Position innerhalb des Layouts, beim GridLayout in welche "Zelle" man es einfügt.

Bei verschachtelten Layouts braucht man schon ein bischen Übung, um das gewünschte Resultat zu erhalten, im Designer sieht man es ja gleich bei der Anwendung des Layouts.

Ciao,
_

Mat
26-11-2005, 19:20
Hallo,
da ich nun schon über 8 stunden ohne erfolg etwas versuche....und nirgendwo eine richtige anleitung finde nochmals hier im forum:

Ich versuche mit dem qt-designer einfach nur eine groupbox also eine Box die eine ÜBerschrift hat mit mehreren widgets eine dynamic so zu erhalten dass sich die box immer so anpasst wie groß die widgets in ihr sind....

Also:
Meine Groubbox hat links einfach 4 Lables und jeweils rechts zu jedem label ein QLineEdit entry-field.
Darunter befindet sich noch ein Label mit einer ComboBox.

Egal wie ich die Layouts anlege.....ob ich zeilenweise oder spaltenweise Layouts anlege oder dann verschachtelt oder sonstwie komplex. Ob ich Als SizePolicy FIXED/EXPANDING/MINIMUM oder egal was hernehme....für die Spacer sowie für alles andere......

sobald ich die Schriftgröße z.B auf 20 Stelle wird alles in der Box abgeschnitten und sie dehnt sich nicht aus so dass alles sichtbar wird in der GroupBox....

Es wäre für mich sehr hilfreich ein Beispiel zu haben wie es geht.

Desweiteren....
Ich habe mindestens 20 Groupboxen.
Wenn ich jetzt für jede der GroupBoxen jeweil so wie ich bis jetzt immer arbeiten musste ca. 10 - 20 Spacer brauche....da werde ich ja alt ?!?!

Arbeite ich da irgendwie uneffizient ? Oder wie kann ich exakt alles so definieren wie ich es haben will.....spacer zwischen den widgets...spacer zum groupbox rand hin....spacer zwischen den groupboxen etc....

Ist das so hochkomplex?

Für eure Hilfe bin ich sehr sehr dankbar.....:)

Kirsche
27-11-2005, 14:21
Hallo Mat,

im Qt-Buch ist ganz Ganze gut erklärt. Angeblich gibt es das auch im Internet (als pdf?). Ich weiß allerdings nicht wo. Ich habe es nur mal gehört bzw. gelesen.

Ansonsten: Probier mal ein einfaches Beispiel aus. Erstelle dir ein Fenster mit z.B. QDialog. Dann setzt du ein Gridlayout auf dieses Fenster. In das GridLayout fügst du verschiedene Unterfenster ein, also z.B. QButton, QLabel und QLineEdit. Dann guck dir das Ergebnis an. Theoretisch müsste sich das Layout immer mit anpassen, wenn du die Größe dieses Fensters änderst. Spacer brauchst du da erst einmal gar nicht. Mit Margin und - ich glaube - Spacing, kannst du den Abstand zum Rand bzw. zwischen den Fenstern einstellen. Das ist aber schon bei QLayout eingebaut. Wenn du das hast, kannst du QHBoxLayout und QVBoxLayout ausprobieren. Und wenn das alles klappt, kannst du mit Spacern und Stretches arbeiten. Das ist dann für den Feinschliff.

Schöne Grüße,

anda_skoa
28-11-2005, 14:29
Ansich sollte das ziemlich einfach sein.

Groupbox auf das Widget setzen

Elemente einfügen und korrekt anordnen

Groupbox selektieren

Toolbar Icon für Gridlayout klicken, fertig

Am Schluß nicht vergessen, das Widget bzw den Dialog auf mit einem Layout zu versehen.

Ciao,
_

Mat
28-11-2005, 18:05
Danke,
das war mein Fehler...ich habe immer vergessen gehabt auch das "HauptWidget" zu layouten.

@Anda...

könntest du mir vielleicht ein kleines Beispiel geben wie ich denn sinnvoll von der Klasse die ich mit dem Designer erstelle erbe einfach?

Also ich bin es leid sobald ich ne Änderung an der GUI mache meine Funktionellen Aufbau ändern zu müssen.
Ich habe es jetzt so dass ich ne Klasse für die GUi habe und ne andere für den Ausbau also die Funktionalität und so...

So wäre es doch am einfachsten oder ?
Bloß ich kann nur auf die Elemente zugreifen wenn ich im Konstruktor der Klasse die die GUI beschreibt auf dem Heap den Konstruktor der FunktionalKlasse aufrufe.

Aber das muss doch einfacher gehen..........
Weil du gemeint hast in nem vorigen posting..........von der KLasse erben.........DANKE

anda_skoa
28-11-2005, 22:39
Ich mach das immer so:

Widget/Dialog im Designer erstellen
Als Name ...Base, also zB SetupDialogBase

Das wird dann in eine Datei setupdialogbase.ui gespeichert, woraus UIC dann setupdialogbase.h und setupdialogbase.cpp generiert

Dann macht man eine ganz nornale Klasse



#if !defined(SETUPDIALOG_H)
#define SETUPDIALOG_H

#include "setupdialogbase.h"

class SetupDialog : public SetupDialogBase
{
Q_OBJECT

public:
SetupDialog(QWidget* parent, const char* name = 0); // oder was man auch immer braucht
};

#endif


Alle Widgets des Dialogs kann man in den Methoden von SetupDialog mit genau den Namen ansprechen, die man zuvor im Designer vergeben hat.

Ciao,
_

Mat
29-11-2005, 02:00
ok danke.......
ich habe es jetzt so:

aus der main rufe ich einen QDialog auf der mein MainWindow_Base ist.
In desssen Konstruktor wird dann die Klasse MainWindow_Use aufgerufen und auch andere Base_Klassen die das MainWindow_Base ergänzen. Der Aufruf wird über Heap ALloziierung aufgerufen. also: neue_Base* nB = new neue_Base(this);

Ist das so auch einigermaßen verständlich?

Ich hatte schwierigkeiten aus der Main dann nähmlich das Hauptfenster aufzurufen und daraus dann die weiteren Klassen....

Wie sieht es denn aus......kann ich denn aus den anderen Base_klassen dann auch jeweils auf die anderen Base_klassen zugreifen?

anda_skoa
29-11-2005, 13:00
Tut mir leid, das hab ich jetzt nicht verstanden.

Kannst du vielleicht ein Beispiel als .zip anhängen?

Ciao,
_

Mat
29-11-2005, 14:05
hehe...das habe ich mir gedacht...man sollte ab halb drei nachts nichts mehr posten :rolleyes:

Vielleicht ist es besser so:

die main:



int main( int argc, char* argv[] )
{
QApplication app( argc, argv );
MainWindow mw;

app.setMainWidget( &mw );
mw.show();

int ret = app.exec();
return ret;
}


meine MainWindow.cpp die aus der Main aufgerufen wird (natürlich nur das wichtige):



MainWindow::MainWindow( QWidget* parent, const char* name, bool modal, WFlags fl )
: QDialog( parent, name, modal, fl )
{
// hier kommen die widgets....

// am ende des konstruktors also hier kommt der Aufruf der KLasse
// mainwindow_use die eben die MainWindow (MainWindowBase)nutzt....
// ebenfalls wird nodeMovement_Base aufgerufen die eine ToolBox-page von
// Mainwindow ausbaut...(ich wollte eben das in einer eigenen Klasse)

MainWindow_use* mw = new MainWindow_use(this);
NodeMovement_Base* nm = new NodeMovement_Base(this);
}


Die header datei von mainwindow :



class MainWindow : public QDialog
{
Q_OBJECT

public:
MainWindow( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 );

...
}


und dann noch die nodeMovement_Base.cpp:



NodeMovement_Base::NodeMovement_Base(MainWindow* mw) : QObject(0, "MainWindow"), m_mw(mw)
{
...
//hier kommen die widgets

//hier wird dann im konstruktor
// wider die nodeMovement_Use aufgerufen die die GUI der page
// nutzt also die funktionalität ausbaut.

}


die header datei von nodeMovement_base.h



class NodeMovement_Base : public QObject
{
Q_OBJECT

public:
NodeMovement_Base( MainWindow* mw);
~NodeMovement_Base();

MainWindow* m_mw;
...
}


Kannst du damit was anfangen anda?
Wenn nicht kann ich dir den ganzen salat dann mal zukommen lassen...

anda_skoa
29-11-2005, 21:54
Am besten du machst ein Archiv der Sourcen und hängst das an.

Soweit ich bisher sehen ein bischen eigenwilliges Design, aber nicht unmöglich.

Einfacher ist es die Widgets im Designer zu erzeugen.

Ciao,
_

Mat
29-11-2005, 22:11
im Anhang die srcen... ich hoffe sie sind verständlicher Danke schon mal im vorauswas ich eigentlich will ist folgendes:ichhabe eine ToolBox mit ca. 7 pages. Da in jeder page ziemlich viele widgets sind wollte ich für jede page eine eigene Base class die nur die GUI baut und desweiteren für jede page eine eigene Use class die die eigentliche Funktionalität ausbaut. Nun würde ich weiter gerne wissen ob das so realisierbar sinnvoll ist. Ob ich dann aus jeder beliebigen use class auf andere base classen zugreifen kann etc...

vielleicht kannst du mir noch helfen anda...
falls du die Gui laufen lässt....in der node_movement page der toolBox weiß ich absolut nicht wie ich jetzt die tabellen so verkleinere dass sie komplett mit dem fram nur bis zum toolBox - Rand ragen und nicht darüber hinaus...so sind die unschönen scrollbars immer vorhanden.....weißt du wie ich dieses Problem lösen kann...? Mit dem designer habe ich es immer mehr verkleinert aber in der GUI bleibt es immer so.....?!?

anda_skoa
01-12-2005, 21:19
Uiui! ;)

Wenn ich da im ersten Versuch richtig sehe, ist dein Hauptwidget eine QToolBox und deren Items die eigentliche GUI.

Ich würde jedes Item als ein eigenes Widget im Designer erstellen, davon ableiten und alles internen Funktionalitäten des Items in der Subklasse implementieren.

Das Hauptwidget wäre dann etwa so



class MainWindow : public QToolBox
{
Q_OBJECT
public:
MainWindow();
};




MainWindow::MainWindow() : QToolBox(0, "MainWindow")
{
addItem(new ItemClass1(this));
addItem(new ItemClass2(this));

// bzw, wenn du später zugriff auf die genauen APIs der Items brauchst
m_item1 = new ItemClass1(this);
addItem(m_item1);
}


Ciao,
_

Mat
01-12-2005, 22:23
das ist natürlich noch schöner :o) bloß irgendwie krieg ich es nicht hin nur die rohe toolbox als einzelnes darstellen zu lassen.... könnntest du mir da auf die sprünge helfen anda ? Also ich rufe aus der main den konstruktor auf der eben: MainWindow() : QToolBox(0, "Mainwindow") ist und im header: class MainWindow : public QToolBox aber so scheint es nicht zu gehen ....*grmpf

Ich weiß nicht wie ich die Konstruktoren der Items aussehen müssen also was die für Parameter bekommen und von was die erben müssen?

anda_skoa
02-12-2005, 09:18
Die Toolbox ist ein normales Widget, sollte also schon angezeigt werden

Falls sie noch leer ist, mußt du vielleicht eine Größe setzen



int main(int argc, char** argv)
{
QApplication app(argc, argv);

MainWindow w;
w.resize(400, 600);

app.setMainWindow(&w);
w.show();

return app.exec();
}


Die Items sind deine Form Subklassen, leiten also von der jeweiligen Base Klasse ab, die UIC generiert hat.
Als Konstruktor nimmst am erst einmal einen Standard QWidget Konstruktor, also einen QWidget* parent Parameter und einen const char* name Parameter

Ciao,
_

Mat
02-12-2005, 15:26
ok danke .... jetzt gehts... das heißt die klassen die die base klassen um die funktionalität erweitern..wo rufe ich die denn auf ? in der klasse wo ich addItem(page) sage ? wie kann ich den sinnvoll die use klassen aufrufen....weil ich würde die schon gerne so implementieren die funktionalitäten... also über den heap muss ich das dann wohl machen oder ?

EDIT: Kann ich das überhaupt?
Ich habe nun die MainWindow_use die erbt die MainWindow_Base sozusagen. MainWindow_Base baut mir die erste page der Toolbox aus was funktioniert.
Aber wie kann ich nun die MainWindow_Use aufrufen. Ich kann ja jetzt nicht in der Mainwindow_Base den Konstruktor von MainWindow_Use aufrufen ... weil die ja vererbt wird ...

anda_skoa
03-12-2005, 13:46
Ich hab mal ein Beispiel gemacht wie ich mir das vorstelle

Ciao,
_

Mat
03-12-2005, 19:49
vielen dank anda....jetzt verstehe ich auch was du meinst....*frag mich immer nur warum mir das nicht einfällt so..*grmpf...

naja...aber ganz schaffe ich es noch nicht zum laufen zu bringen dein beispiel..
er meckert wegen undefined reference table. also ich kompiliere die .ui mit uic zu den gesuchten header dateien....aber muss ich die .ui dateien irgendwie einbinden ?

anda_skoa
03-12-2005, 20:10
#> qmake multiwidget.pro
#> make
#> ./multiwidget

Ciao,
_

Mat
03-12-2005, 20:36
Vielen lieben dank Anda....habe enorm dazu gelernt....jetzt mach ich mich mal daran mein ganzes programm umzudesignen ....;)

microdigi
28-03-2006, 23:09
Mein lieber Mann, Fräulein, watt kannse gut tanzen.
So sagt man im Ruhrgebiet.
Also Du hast ja eine Engelsgeduld.
Ich sag auch nochmal danke für diesen Thread.
Aloha - digi