[gelöst] Elemente in Widget werden nicht angezeigt

Alles rund um die Programmierung mit Qt
Antworten
Digit
Beiträge: 5
Registriert: 10. März 2008 12:10

[gelöst] Elemente in Widget werden nicht angezeigt

Beitrag 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
Zuletzt geändert von Digit am 11. März 2008 11:40, insgesamt 1-mal geändert.
moviemax
Beiträge: 56
Registriert: 10. März 2008 09:49
Wohnort: München

Beitrag 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();


Digit
Beiträge: 5
Registriert: 10. März 2008 12:10

Beitrag 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
moviemax
Beiträge: 56
Registriert: 10. März 2008 09:49
Wohnort: München

Beitrag von moviemax »

mhh kann da so auch nichts feststellen,
aber mach doch erst das
ui.wdgPlaceholder widget fertig
und dann nur ui.wdgPlaceholder.show();
Digit
Beiträge: 5
Registriert: 10. März 2008 12:10

Beitrag 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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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
Digit
Beiträge: 5
Registriert: 10. März 2008 12:10

Beitrag 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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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
Digit
Beiträge: 5
Registriert: 10. März 2008 12:10

Beitrag von Digit »

Peinlich, peinlich!

Hatte den Dialog mit new angelegt aber die Variable war kein Zeiger.

Digit
Antworten