QTabWidget::removeTab() -> welches Signal wird emittiert?

Alles rund um die Programmierung mit Qt
Antworten
M@g!ndo$ch
Beiträge: 70
Registriert: 7. Januar 2007 14:56

QTabWidget::removeTab() -> welches Signal wird emittiert?

Beitrag von M@g!ndo$ch »

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
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

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.
M@g!ndo$ch
Beiträge: 70
Registriert: 7. Januar 2007 14:56

Beitrag von M@g!ndo$ch »

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?
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

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.
M@g!ndo$ch
Beiträge: 70
Registriert: 7. Januar 2007 14:56

Beitrag von M@g!ndo$ch »

Du meinst ungefähr so?

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));
	}
}
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 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.");
	}
}
Antworten