Hallo,
gibt es eine Möglichkeit ein Element, welches ich im Qt Designer erstellt habe in ein Splitter Fenster einzubinden z.B. rechts und ein anderes im linken Splitter Fenster.
Ich möchte also, die Anwendung im Designer erstellen, die Anordnung der Fenster aber dann mit Hand schreiben z.B. main Funktion.
Ich benutze VS 2003 und Qt 4.0.1
Designer Splitter
Du erstellst im Designer ein QWidget und packst schön was rein.
Dann schreibst du dir eine eigene Klasse, die einen QSplitter enthält
und fügst da dein im Designer erstelltes QWidget ein.
Wie man in der selbstgeschriebenen Klasse auf im Designer erstellte Fenster zugreift steht hier:
http://doc.trolltech.com/4.0/designer-u ... t-approach
HENNING
Dann schreibst du dir eine eigene Klasse, die einen QSplitter enthält
und fügst da dein im Designer erstelltes QWidget ein.
Wie man in der selbstgeschriebenen Klasse auf im Designer erstellte Fenster zugreift steht hier:
http://doc.trolltech.com/4.0/designer-u ... t-approach
HENNING
Erstmal danke Henning für Deine Antwort.
Ich habe alles so gemacht, wie Du es beschrieben hast, leider komme ich nicht weiter.
Ich muss vielleicht dazusagen, dass ich ein absoluter Qt 4 Anfänger bin.
Also noch mal zu Problem:
Hier ist meine Selbstgeschriebene Klasse:
void splitt::drucke()
{
//Splitter
QSplitter* splitter1 = new QSplitter();
splitter1->setOrientation(Qt::Horizontal);
splitter1->setGeometry(40, 30, 800, 350);
////////////////////////////////////////////////
/// Linkes Splittfenster
QWidget* wgLinks = new QWidget(splitter1);
wgLinks->setPalette(Qt::yellow);
///Slider
QSlider *myslider = new QSlider(Qt::Horizontal, wgLinks);
myslider->setRange(0 ,99);
myslider->setValue(0);
myslider->setGeometry(10, 10, 180, 30);
////////////////////////////////////////////////
/// GI – Rechtes Splittfenster
QWidget* wgGUI =new QWidget(splitter1);
im_Designer_erzeugt *guiTest = new im_Designer_erzeugt;
Ui::im_Designer_erzeugtClass ui;
ui.setupUi(guiTest);
splitter1->show();
}
Ich weiß jetzt nicht, wie ich in das rechte Splitter Fenster mein im Designer erzeugtes Objekt hineinbekomme?
Also das „guiTest“ in „splitter1“.
Geht vielleicht mit „addWidget“ ???
Es kommt auch keine Fehlermeldung es wird eben nur nicht angezeigt.
Ich habe alles so gemacht, wie Du es beschrieben hast, leider komme ich nicht weiter.
Ich muss vielleicht dazusagen, dass ich ein absoluter Qt 4 Anfänger bin.
Also noch mal zu Problem:
Hier ist meine Selbstgeschriebene Klasse:
void splitt::drucke()
{
//Splitter
QSplitter* splitter1 = new QSplitter();
splitter1->setOrientation(Qt::Horizontal);
splitter1->setGeometry(40, 30, 800, 350);
////////////////////////////////////////////////
/// Linkes Splittfenster
QWidget* wgLinks = new QWidget(splitter1);
wgLinks->setPalette(Qt::yellow);
///Slider
QSlider *myslider = new QSlider(Qt::Horizontal, wgLinks);
myslider->setRange(0 ,99);
myslider->setValue(0);
myslider->setGeometry(10, 10, 180, 30);
////////////////////////////////////////////////
/// GI – Rechtes Splittfenster
QWidget* wgGUI =new QWidget(splitter1);
im_Designer_erzeugt *guiTest = new im_Designer_erzeugt;
Ui::im_Designer_erzeugtClass ui;
ui.setupUi(guiTest);
splitter1->show();
}
Ich weiß jetzt nicht, wie ich in das rechte Splitter Fenster mein im Designer erzeugtes Objekt hineinbekomme?
Also das „guiTest“ in „splitter1“.
Geht vielleicht mit „addWidget“ ???
Es kommt auch keine Fehlermeldung es wird eben nur nicht angezeigt.
Ich sehe, du hast dich an die Dokumentation gehalten. Gut. Diese sagt aber auch:ogre hat geschrieben: ////////////////////////////////////////////////
/// GI – Rechtes Splittfenster
QWidget* wgGUI =new QWidget(splitter1);
im_Designer_erzeugt *guiTest = new im_Designer_erzeugt;
Ui::im_Designer_erzeugtClass ui;
ui.setupUi(guiTest);
splitter1->show();
}
In deinem Fall bedeutet das, du erzeugst ein QWidget (falls du im Designer auch nur ein QWidget verwendet hast)... by constructing a standard QDialog that we use to host the user interface ...
und fügst das dem Splitter hinzu. Das Fenster, welches du momentan dem Splitter hinzufügst, enthält ja nichts...
Sollte dann so aussehen:
Code: Alles auswählen
QWidget* host =new QWidget(splitter1);
Ui::im_Designer_erzeugtClass ui;
ui.setupUi(host);
splitter1->show(); Probier das doch einfach mal in der main Funktion.
Einen Splitter kannst du auch dort erstellen und anzeigen.
HENNING
PS: Falls es nicht klappt, meld' dich noch mal...
Hi Henning,
ich habe jetzt noch mal alles in die main Funktion gestopft und den Code wieder etwas verändert:
////////////////////////////////////////////////
/// GI – Rechtes Splittfenster
QWidget* wgGUI =new QWidget(splitter1);
im_Designer_erzeugt *guiTest = new im_Designer_erzeugt ( wgGUI );
Ui::im_Designer_erzeugtClass ui;
ui.setupUi(guiTest);
splitter1->show();
Dein Vorschlag funktioniert leider auch nicht:
QWidget* host =new QWidget(splitter1);
Ui::im_Designer_erzeugtClass ui;
ui.setupUi(host); <<< Fehler: Konvertierung nicht möglich
splitter1->show();
Ich weiß auch nicht mehr, was ich machen soll
ich habe jetzt noch mal alles in die main Funktion gestopft und den Code wieder etwas verändert:
////////////////////////////////////////////////
/// GI – Rechtes Splittfenster
QWidget* wgGUI =new QWidget(splitter1);
im_Designer_erzeugt *guiTest = new im_Designer_erzeugt ( wgGUI );
Ui::im_Designer_erzeugtClass ui;
ui.setupUi(guiTest);
splitter1->show();
Dein Vorschlag funktioniert leider auch nicht:
QWidget* host =new QWidget(splitter1);
Ui::im_Designer_erzeugtClass ui;
ui.setupUi(host); <<< Fehler: Konvertierung nicht möglich
splitter1->show();
Ich weiß auch nicht mehr, was ich machen soll
Doch. Funktioniert.
Öffne den Designer, klicke auf "File" -> "New Form" -> "Widget" -> "Create",
klicke ein bisschen was zusammen,
ersetze bei ObjectName "Form" durch "DesignerWidget",
speichere das ganze unter "DesignerWidget.ui"
kopiere dir diesen Code in eine Datei mit dem Namen "main.cpp",
kompiliere das ganze mit qmake und make und staune!!!
HENNING
Öffne den Designer, klicke auf "File" -> "New Form" -> "Widget" -> "Create",
klicke ein bisschen was zusammen,
ersetze bei ObjectName "Form" durch "DesignerWidget",
speichere das ganze unter "DesignerWidget.ui"
kopiere dir diesen Code in eine Datei mit dem Namen "main.cpp",
kompiliere das ganze mit qmake und make und staune!!!
Code: Alles auswählen
#include "ui_DesignerWidget.h"
#include <QApplication>
#include <QSplitter>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
//Splitter wird erzeugt
QSplitter * splitter = new QSplitter();
//Das "linke" Fesnter (ein einfacher Knopf) wird erzeugt
//und der Splitter wird als 'parent' übergeben
QPushButton * button = new QPushButton(splitter);
//Das "rechte" Fenster (ein leeres Widget) wird erzeugt
//und der Splitter wird wieder als 'parent' übergeben
QWidget *widget = new QWidget(splitter);
//Hier wird nun ein "DesignerWidget" erstellt.
//Das habe ich vorher im Designer mit New Form -> Widget erstellt
//WICHTIG: Es darf kein Dialog sein, sonst muss die obere Zeile
//natürlich einen Dialog erstellen, kein Widget!
Ui::DesignerWidget ui;
ui.setupUi(widget);
//klar
splitter->show();
return app.exec();
}Ich sehe, staune und verneige mich!!!
Funktioniert echt super vielen vielen Dank.
Ich hatte die QWidget nicht als Basisklasse verwendet, wahrscheinlich funktionierte es deshalb nicht.
Ich habe da gleich eine zweite Frage, und zwar:
Ich habe mein Fenster in zwei Teile „gesplittet“, das rechte habe ich mit den Desiger („hallo rechts“ steht links oben in der ecke) erstellt und das linke programmiert da steht „hallo links“ (QLabel *label = new QLabel(splitter); label->setText("hallo links ");
).
Wenn ich jetzt die Fenstergröße verändere bleibt „hallo rechts“ (also das welches ich im Designer erstellt habe) immer links oben in der ecke fix stehen.
„hallo links“ hingegen verändert sich relativ zur Fenstergröße und steht immer in der Fenstermitte.
Gibt es einen Möglichkeit „hallo links“ ebenfalls „fix“ zu setzen, so dass es seine Koordinaten nicht verändert, wenn die Fenstergröße variiert.

Funktioniert echt super vielen vielen Dank.
Ich hatte die QWidget nicht als Basisklasse verwendet, wahrscheinlich funktionierte es deshalb nicht.
Ich habe da gleich eine zweite Frage, und zwar:
Ich habe mein Fenster in zwei Teile „gesplittet“, das rechte habe ich mit den Desiger („hallo rechts“ steht links oben in der ecke) erstellt und das linke programmiert da steht „hallo links“ (QLabel *label = new QLabel(splitter); label->setText("hallo links ");
).
Wenn ich jetzt die Fenstergröße verändere bleibt „hallo rechts“ (also das welches ich im Designer erstellt habe) immer links oben in der ecke fix stehen.
„hallo links“ hingegen verändert sich relativ zur Fenstergröße und steht immer in der Fenstermitte.
Gibt es einen Möglichkeit „hallo links“ ebenfalls „fix“ zu setzen, so dass es seine Koordinaten nicht verändert, wenn die Fenstergröße variiert.
Es gibt viele Möglichkeiten das zu erreichen. Aber ich werde dir erstmal sagen warum das überhaupt passiert.
Im Designer hast du ein ganzes Fesnter erstellt.
Ich vermute mal, du hast oben ein Label und unten einen Spacer.
Wird die vertikale Größe des Fensters nun geändert, so nimmt der Spacer den Platz auf.
Im anderen Fall hast du nur ein Label und der Platz muss immer von diesem ausgefüllt werden.
Am einfachsten wäre es vielleicht, wenn du links eine ähnliche Konstruktion verwendest.
z.B. vertikales Layout mit Splitter-parent erstellen, Label einfügen, Spacer einfügen
oder du schaust in die Dokumentation und sagst dem Label, dass Text links oben ausgerichtet sein soll.
Die Möglichkeiten sind vielfältig und probieren geht über... naja ist jedenfalls erlaubt.
HENNING
Im Designer hast du ein ganzes Fesnter erstellt.
Ich vermute mal, du hast oben ein Label und unten einen Spacer.
Wird die vertikale Größe des Fensters nun geändert, so nimmt der Spacer den Platz auf.
Im anderen Fall hast du nur ein Label und der Platz muss immer von diesem ausgefüllt werden.
Am einfachsten wäre es vielleicht, wenn du links eine ähnliche Konstruktion verwendest.
z.B. vertikales Layout mit Splitter-parent erstellen, Label einfügen, Spacer einfügen
oder du schaust in die Dokumentation und sagst dem Label, dass Text links oben ausgerichtet sein soll.
Die Möglichkeiten sind vielfältig und probieren geht über... naja ist jedenfalls erlaubt.
HENNING