Problem mit QMdiArea,QMdiSubWindow,UI und Auto-Connects

Alles rund um die Programmierung mit Qt
Antworten
chrislo1976
Beiträge: 105
Registriert: 24. Februar 2008 09:45

Problem mit QMdiArea,QMdiSubWindow,UI und Auto-Connects

Beitrag von chrislo1976 »

Hallo!

Ich habe in einem Programm folgende Situation:

Ein QMainWindow mit einer QMdiArea als CentralWidget. Dieser QMdiArea füge ich per addSubWindow() Objekte hinzu die von QMdiSubWindow abgeleitet sind und über eine UI verfügen (UI-Datei vom Designer).
Vorher waren die Objekte von QWidget abgeleitet und da gabs auch keine Probleme, allerdings funktionierte da die Wiederherstellung der Größen und Positionen der Fenster nicht richtig.

Jetzt das Problem:

Wenn ich nun im Programm so ein SubWindow öffne, wird die komplette UI völlig in der oberen linken Enke zusammengeschoben und ist so völlig unbrauchbar.
Im Ausgabefenster kommt dabei diese Warnung :

Code: Alles auswählen

QLayout: Attempting to add QLayout "" to reports::CViewCommissioningReports "CViewCommissioningReportsClass", which already has a layout
In der Doku und im Internet hab ich dann gelesen warum dies passiert und auch einen Workaround dafür gefunden:

So wars vorher:

Code: Alles auswählen

CViewxxxx::CViewxxxx(QWidget *parent)
    : QMdiSubWindow(parent)
{
	// UI einrichten
	ui.setupUi(this);
...
}

Und so mit dem Workaround:

Code: Alles auswählen

CViewxxxx::CViewxxxx(QWidget *parent)
    : QMdiSubWindow(parent)
{
	QWidget* widget = new QWidget(parent);

	// UI einrichten
	ui.setupUi(widget);

	this->setWidget(widget);
...
}
Prinzipiell würde der Workaround ja funktionieren, die Fenster werden korrekt geöffnet und auch die UI ist genauso wie sie sein soll. Allerdings hab ich jetzt bemerkt dass sämtliche Slots nicht mehr funktionieren die per "Auto-Connect" (on_toolButton_clicked()) verbunden wurden. Das ist aber auch verständlich, da innerhalb setupUI() die Funktion connectSlotsByName() mit dem neu erzeugten Widget aufgerufen wird und nicht mit CViewxxxx, das die Slots enthält.

Jetzt suche ich nach einer Möglichkeit die QMdiSubWindows mit UI verwenden zu können und gleichzeitig aber auch die Funktionialität der Auto-Connects nicht zu verlieren.

Weiß da jemand Rat? Wäre für jede Art Hilfe dankbar!

Gruß,
Christian
chrislo1976
Beiträge: 105
Registriert: 24. Februar 2008 09:45

Beitrag von chrislo1976 »

Hallo!

Ich hab jetzt einfach mal im Konstruktor meines SubWindows folgendes eingefügt:

Code: Alles auswählen

QMetaObject::connectSlotsByName(this);
Und jetzt gehen auch die automatisch verbundenen Signal/Slot-Verbindungen. Jetzt bleibt die Frage, kann/darf/soll ich das so machen oder gibt es evtl. was besseres/schöneres?

Gruß,
Christian
Antworten