QMdiSubWindow
-
janmerkschien
- Beiträge: 45
- Registriert: 5. Juli 2011 10:08
QMdiSubWindow
hey ich habe wieder mal ein problem . . .
und zwar mit dem Subwindows von meiner mdiarea.
ich würde denen gerne einen close butten geben aber die schließen halt immer nur das widget und nicht das subwindow.
ich habe jetzt im i-net das hier gefunden:
http://developer.qt.nokia.com/forums/viewthread/6577
nur wenn ich das in meinem code schreibe öffnet sich nur das subwindow ganz ohne widget -.-
muss ich da noch was anderes im code verändern??
und zwar mit dem Subwindows von meiner mdiarea.
ich würde denen gerne einen close butten geben aber die schließen halt immer nur das widget und nicht das subwindow.
ich habe jetzt im i-net das hier gefunden:
http://developer.qt.nokia.com/forums/viewthread/6577
nur wenn ich das in meinem code schreibe öffnet sich nur das subwindow ganz ohne widget -.-
muss ich da noch was anderes im code verändern??
Re: QMdiSubWindow
Was ist denn bei Dir das Widget und was das Subwindow?
Verstehe deine Frage nicht so ganz.
Verstehe deine Frage nicht so ganz.
-
janmerkschien
- Beiträge: 45
- Registriert: 5. Juli 2011 10:08
Re: QMdiSubWindow
mein subwindow:
und als windget habe ich "table" bezeichnet . .
und table beinhaltet einfach nur ein layout
mit einem closebutton:
aber dann wird immer nur das table geschlossen und das sw bleibt
Code: Alles auswählen
table *child = new table;
QMdiSubWindow *sw = new QMdiSubWindow;
sw = mdiArea->addSubWindow(child);
sw->resize(600,400);
child->show();und table beinhaltet einfach nur ein layout
mit einem closebutton:
Code: Alles auswählen
connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));Re: QMdiSubWindow
Du erzeugst hier ein Objekt das du nicht nutzt und irgendwo im Speicher herumschwirrt.
besser wäre
Und wenn du close() nur auf dein child machst, warum sollte sich sw dann schließen?
Code: Alles auswählen
QMdiSubWindow* sw = new QMdiSubWindow;
sw = mdiArea->addSubWindow(child);
Code: Alles auswählen
QMdiSubWindow* sw = mdiArea->addSubWindow(child);
-
janmerkschien
- Beiträge: 45
- Registriert: 5. Juli 2011 10:08
Re: QMdiSubWindow
wie kann ich denn ein close auf das subwindow machen?
Re: QMdiSubWindow
Ein QMdiSubWindow ist auch nur ein Widget und hat damit auch die Methode close().
Steht so in der Doku.
Warum brauchst du denn einen extra closeButton? Du kannst doch auch das SubWindow über
den closeButton in der Titelzeile schliessen.
Steht so in der Doku.
Warum brauchst du denn einen extra closeButton? Du kannst doch auch das SubWindow über
den closeButton in der Titelzeile schliessen.
Re: QMdiSubWindow
Kommt jetzt drauf an, in wie weit dein table generisch verwendebar bleiben soll, also auch außerhalb der MdiArea.
Eine elegante Lösung dürfte sein, das closeEvent von table abzufangen (installEventFilter) und dann im eventFilter mdiArea->removeSubWindow aufzurufen (das QCloseEvent musst du ignorieren).
Wenn du das wirklich nur in der mdiArea haben willst, übergib dem Konstruktor von table ein QMdiArea* mdi, speicher es ab, dann kannst du direkt im closeEvent dich selbst entfernen. Oder ein eigenes SIGNAL emittieren, wenn der Button gedrückt wird, damit dein MainWindow drauf reagieren kann, um es aus der MdiArea zu entfernen (hier den click nicht mehr auf close() connecten).
// edit:
Eine elegante Lösung dürfte sein, das closeEvent von table abzufangen (installEventFilter) und dann im eventFilter mdiArea->removeSubWindow aufzurufen (das QCloseEvent musst du ignorieren).
Wenn du das wirklich nur in der mdiArea haben willst, übergib dem Konstruktor von table ein QMdiArea* mdi, speicher es ab, dann kannst du direkt im closeEvent dich selbst entfernen. Oder ein eigenes SIGNAL emittieren, wenn der Button gedrückt wird, damit dein MainWindow drauf reagieren kann, um es aus der MdiArea zu entfernen (hier den click nicht mehr auf close() connecten).
// edit:
Das hab ich mich auch gefragt. Könnte sein, weil der das Widget auch mal als eigenes Fenster ohne MDIArea laufen lassen will, oder als Dialog (wenngleich es eigentlich immer eine Window-Deko gibt, die auch einen "close"-Knopf hat).archer hat geschrieben:Warum brauchst du denn einen extra closeButton? Du kannst doch auch das SubWindow über
den closeButton in der Titelzeile schliessen.
-
janmerkschien
- Beiträge: 45
- Registriert: 5. Juli 2011 10:08
Re: QMdiSubWindow
ich versuche deinen 2ten vorschlag zu realisieren.
jetzt habe ich im konstruktor von table das QMdiArea eingebaut aber jetzt bekomme ich ne fehlermeldung . .
hier die zeilen:
mainwondow.cpp
hier bekomme ich diese fehlermeldung:
expected primary-expression before '*' token
table.cpp
table.h
jetzt habe ich im konstruktor von table das QMdiArea eingebaut aber jetzt bekomme ich ne fehlermeldung . .
hier die zeilen:
mainwondow.cpp
Code: Alles auswählen
QMdiSubWindow *sw = mdiArea->addSubWindow(new table(QMdiArea* mdiArea));expected primary-expression before '*' token
table.cpp
Code: Alles auswählen
table::table(QMdiArea *parent):
QWidget(parent)
{
QMdiArea ma = parentWidget(); // zum speichern der MdiAreaCode: Alles auswählen
public:
table(QMdiArea *parent = 0);Re: QMdiSubWindow
Code: Alles auswählen
QMdiSubWindow *sw = mdiArea->addSubWindow(new table(QMdiArea* mdiArea));Code: Alles auswählen
table::table(QMdiArea *parent):
QWidget(parent)
{
QMdiArea ma = parentWidget(); // zum speichern der MdiAreaIch würde mich später auch nicht drauf verlassen, dass parentWidget() wirklich das QMdiSubWindow zurück gibt. Du könntest dich durch alle parents hangeln, und immer mit inherits() prüfen, ob ein QMdiSubWindow vorliegt.
Die Basisinitialisierung "QWidget(parent)" hat auch nicht so viel Sinn, da nach dem Einfügen in die MdiArea wieder ein anderes parent gesetzt wird.
-
janmerkschien
- Beiträge: 45
- Registriert: 5. Juli 2011 10:08
Re: QMdiSubWindow
QMdiSubWindow *sw = mdiArea->addSubWindow(new table(*mdiArea));
wäre das denn jetzt richtig?
wäre das denn jetzt richtig?
Re: QMdiSubWindow
Code: Alles auswählen
QMdiSubWindow *sw = mdiArea->addSubWindow(new table(mdiArea));
-
janmerkschien
- Beiträge: 45
- Registriert: 5. Juli 2011 10:08
Re: QMdiSubWindow
ok soweit so gut . . .
nur wenn ich jetzt den button drücke:
wird die mdiarea geschlossen ist ja klar die übergebe ich ja auch . .
aber wie komm ich jetzt an das subwindow`?
nur wenn ich jetzt den button drücke:
Code: Alles auswählen
connect(quitButton, SIGNAL(clicked()), parent, SLOT(close()));aber wie komm ich jetzt an das subwindow`?
-
janmerkschien
- Beiträge: 45
- Registriert: 5. Juli 2011 10:08
Re: QMdiSubWindow
okay danke an alle habs hinbekommen 
Re: QMdiSubWindow
Also, ich würde an deiner Stelle in deinem table ein signal anlegen
im cpp ein connect
und beim Erzeugen deiner table und des mdiSubWindow
Dann brauchst du keine Zeiger weitergeben.
Code: Alles auswählen
signals:
void closeTable();
Code: Alles auswählen
connect(quitButton, SIGNAL(clicked()), this, SIGNAL(closeTable()));
Code: Alles auswählen
table* pTable = new table;
QMdiSubWindow *sw = mdiArea->addSubWindow(pTable);
connect(pTable, SIGNAL(closeTable()), sw, SLOT(close()));
-
janmerkschien
- Beiträge: 45
- Registriert: 5. Juli 2011 10:08
Re: QMdiSubWindow
ich hab jetzt beim erzeugen der tabelle nicht die mdiarea übergeben sondern das subwindow und dann kann ich das ganz einfach mit nem close in der table.cpp schließen
Code: Alles auswählen
QMdiSubWindow *sw = new QMdiSubWindow(mdiArea);
sw->setWidget(new table(sw));
sw->setAttribute(Qt::WA_DeleteOnClose);
mdiArea->addSubWindow(sw);
sw->show();
Code: Alles auswählen
connect(quitButton, SIGNAL(clicked()), parent, SLOT(close()));