Hi,
wenn man von einem TabWidget ein Tab mittels "removeTab()" entfert,
emittiert dann das darin "enthaltene" Widget ein bestimmtes Signal?
"destroyed()" laut Doku zu removeTab() ja anscheinend nicht
Ich bräuchte das aus folgendem Grund:
Das Widget, welches "removed" wurde ist ein Member einer anderen Klasse "Session". Wenn nun das Widget aus dem TabWidget entfernt wurde, soll auch die entsprechende Instanz der "Session" zerstört werden.
Dies wollte ich mit Hilfe von Signals erreichen, da das Widget eigentlich nix über die Existenz der "Session" Klasse zu wissen braucht.
Gruß M@g
QTabWidget::removeTab() -> welches Signal wird emittiert?
-
- Beiträge: 70
- Registriert: 7. Januar 2007 14:56
tabRemoved überschreiben und dann kannst Du dein eigenes Signal verschicken.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
-
- Beiträge: 70
- Registriert: 7. Januar 2007 14:56
Das war auch meine erste Idee.... passt allerdings nicht so richtig zu meinem Design.
Ich müsste dann ja mit dem Signal irgendwas mitgeben wodurch klar wird welche Tab (genauer welches Widget) entfernt wurde.
Da ist mir aber nix "sauberes" eingefallen.
Außerdem müsste ich dann die TabWidget -Instanz per Signal mit der Session-Instanz verbinden. Mir wäre es aber lieber, das im Tab enthaltene Widget mit der Session direkt zu verbinden, da das Widget ja sowieso ein Member der Session-Klasse ist, d.h. ich kann die Objekte verbinden wenn ich die Widget-Instanz der Session-Instanz zufüge.
Wird da denn gar kein Signal von dem entfernten Widget emittiert?
Ich müsste dann ja mit dem Signal irgendwas mitgeben wodurch klar wird welche Tab (genauer welches Widget) entfernt wurde.
Da ist mir aber nix "sauberes" eingefallen.
Außerdem müsste ich dann die TabWidget -Instanz per Signal mit der Session-Instanz verbinden. Mir wäre es aber lieber, das im Tab enthaltene Widget mit der Session direkt zu verbinden, da das Widget ja sowieso ein Member der Session-Klasse ist, d.h. ich kann die Objekte verbinden wenn ich die Widget-Instanz der Session-Instanz zufüge.
Wird da denn gar kein Signal von dem entfernten Widget emittiert?
Du könntest im tabRemoved das Widget löschen, dann sollte auch das destroyed-Signal kommen. Geht natürlich nur wenn das Widget wirklich nicht mehr gebraucht wird.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
-
- Beiträge: 70
- Registriert: 7. Januar 2007 14:56
Du meinst ungefähr so?
Das hab ich schon versucht, allerdings passiert bei delete ein Assertion Fehler.
Sieht so aus also ob der Zeiger zu dem Zeitpunkt schon ungültig wäre. Das muss ich mal noch näher untersuchen, kann mir allerdings nicht erklären warum der Zeiger ungültig sein soll. Das widget wird nämlich mit "new" erzeugt...
Code: Alles auswählen
void OperationTabsContainer::removeTab(int iIndex)
{
QWidget *pWidget = widget(iIndex);
if(pWidget != NULL)
{
delete pWidget;
QTabWidget::removeTab(iIndex);
}
else
{
LOG_ERROR_2("Could not get Widget at index ", static_cast<qint32>(iIndex));
}
}
Sieht so aus also ob der Zeiger zu dem Zeitpunkt schon ungültig wäre. Das muss ich mal noch näher untersuchen, kann mir allerdings nicht erklären warum der Zeiger ungültig sein soll. Das widget wird nämlich mit "new" erzeugt...
Code: Alles auswählen
void MainWindow::addOperationTab(EditSession *pEditSession)
{
if(pEditSession != NULL)
{
//Operation Tab is created here, because GuiWidgets must be created by GuiThread
OperationTab *pTab = new OperationTab();
pEditSession->setOperationTab(pTab);
pTab->initialize(pEditSession);
bool bResult = connect(pTab,SIGNAL(destroyed()),pEditSession,SLOT(destroy()));
int iTabIdx = m_oOperationTabs.addTab(pTab,pEditSession->getOperationname());
m_oOperationTabs.setTabToolTip(iTabIdx, pTab->getToolTip());
m_oOperationTabs.setCurrentWidget(pTab);
}
else
{
LOG_ERROR_1("Operation \"MainWindow::addOperationTab()\" was called with a NULL pointer.");
}
}