Seite 1 von 1
[gelöst] Elemente in Widget werden nicht angezeigt
Verfasst: 10. März 2008 12:34
von Digit
Hi,
das ist hier mein erster Beitrag, ich hoffe mal, daß ich nicht zuviel verkehrt mache.
Zu meinem Problem:
Ich habe einen QDialog, von dem leite ich eine weitere Klasse ab. In der abgeleiteten Klasse möchte ich gerne weitere Elemente dem Dialog hinzufügen.
Also definiere ich in der Basisklasse ein Widget, in das ich die Grafik-Elemente aus der abgeleiteten Klasse packe, und setze in der Header-Datei die UI auf public.
In der abgeleiteten Klasse definiere ich zuerste die zusätzlichen grafischen Elemente mit dem Platzhalter-Widget aus der Basisklasse. Dann noch ein Layout und da packe ich die Elemente rein.
Dann zeige ich das ganze mit show() an.
Wenn ich mir das Ganze dann anzeigen lassen möchte, ist das Widget leer, die Elemente werden nicht angezeigt.
Die Qt-Version ist 4.3.3.
Hat jemand eine Idee, woran es liegen könnte?
Digit
Verfasst: 10. März 2008 13:18
von moviemax
vielleicht fehlt noch das layout dem widget hizuzufügen
Code: Alles auswählen
Widget::Widget {
...
mainLalylout = new QHboxLayout;
mainLalylout->addLayout(layer1);
mainLalylout->addLayout(layer2);
setLayout(mainLayout);
}
... Widget w = Widget;
w.show();
Verfasst: 10. März 2008 13:33
von Digit
Nein, das habe ich schon versucht, also so ziemlich genau wie es bei den Layouts im Assistant beschrieben ist.
Der Konstruktor der abgeleiteten Klasse sieht so aus:
Code: Alles auswählen
ChildClass::ChildClass( QWidget *parent )
: BaseDlg( parent )
{
//add a label with the text "Tests" to the widget in the baseclass,
//which is a placeholder for more graphic items
QLabel *testLabel = new QLabel ( tr( "Tests" ), ui.wdgPlaceholder );
QLabel *testLabel2 = new QLabel ( tr( "Test2" ), ui.wdgPlaceholder );
QVBoxLayout *vbox = new QVBoxLayout();
vbox->addWidget( testLabel );
vbox->addWidget( testLabel2 );
ui.wdgPlaceholder->setLayout( vbox );
ui.wdgPlaceholder->show();
}
Digit
Verfasst: 10. März 2008 14:36
von moviemax
mhh kann da so auch nichts feststellen,
aber mach doch erst das
ui.wdgPlaceholder widget fertig
und dann nur ui.wdgPlaceholder.show();
Verfasst: 10. März 2008 16:01
von Digit
Das Widget ist nur ein Platzhalter in der Basisklasse, damit die Grafikelemente am richtigen Platz landen, bzw überhaupt angezeigt dort werden können.
Digit
Verfasst: 10. März 2008 17:50
von franzf
Nur so als Frage:
Warum leitest du eine Klasse von QDialog ab, diese dann nochmal um Elemente hinzuzufügen, um dann im Konstruktor ein einziges Widget aus dem bereits in BaseDlg enthaltenen UI anzuzeigen (show())? Vllt. meintest du ja nur setVisible(true)?
Schenk dir mal das show() und erstelle dir ein ChildClass-Dialog, welchen du dann mit show() oder exec() anzeigst.
Grüße
Franz
Verfasst: 11. März 2008 10:16
von Digit
Ich glaube, da liegt ein kleines Mißverständnis vor.
Der Hintergrund ist der, daß ich ein gutes Dutzend Dialoge habe, die alle gleich aufgebaut sind.
Die Gemeinsamkeiten hab ich in die Basisklasse gepackt und die Unterschiede der einzelnen sollten jeweils in den abgeleiteten Kind-Klassen hinzukommen. Da ist mal eine ComboBox mehr, mal ist da eine Checkbox. Deswegen eine Klasse, die von QDialog ableitet und von der wiederum mehrere Klassen ableiten. Das Codeschnipsel oben war nur ein vereinfachter Test ohne das ganze andere was da dran hängt.
Digit
Verfasst: 11. März 2008 10:55
von franzf
Du hast den letzten Teil des Satzes nicht durchgelesen

Du solltest nicht ein Widget in einem QDialog (den aus deinem .ui) versuchen mit show() anzuzeigen! Da bringt dir der ganze Dialog nichts...
Einen Dialog zeigt man immer als Ganzes an, entweder mit exec() (was dann einen Wert wie QDialog::Accepted o.Ä. zurückgibt) oder mittels (dem von QWidget geerbten) show().
Wenn du im BaseDlg das Platzhalterwidget auf visible=false gesetzt hast (also versteckt) dann setz einfach setVisible(true), aber nicht show() (falls das deine Absicht war).
Hoffe das war jetzt klarer.
Wäre trotzdem gut wenn du hier etwas mehr Code posten könntest, der funktioniert und dein Problem zeigt.
Grüße
Franz
Verfasst: 11. März 2008 11:41
von Digit
Peinlich, peinlich!
Hatte den Dialog mit new angelegt aber die Variable war kein Zeiger.
Digit