QTabWidget: kleines Icon in der rechten Ecke

Alles rund um die Programmierung mit Qt
Antworten
Isa
Beiträge: 32
Registriert: 10. April 2006 13:18

QTabWidget: kleines Icon in der rechten Ecke

Beitrag von Isa »

Hallo,

ich habe ein QTabWidget in mein QMainWindow eingebaut. Nun hätte ich gerne in der rechten oberen Ecke, also auf Höhe der Tabs ein Icon (bzw eine QAction) mit dem ich das aktuelle Tab schließen kann. Es soll genauso wie z.B. im Firefox aussehen. Hat jemand eine Ahnung wie man das macht? Ich habe mir die Klassenreferenz von TabWidget und TabBar bereits angesehen, habe aber nichts gefunden, was mir weiter hilft.
Danke schon mal,

Grüße,
Isa

P.S. Ich benutze Qt 4.1.4 Commercial Edition
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Code: Alles auswählen

QTabWidget::setCornerWidget(QWidget *widget, Qt::Corner corner=Qt::TopRightCorner)
Isa
Beiträge: 32
Registriert: 10. April 2006 13:18

Beitrag von Isa »

Hallo upsala,

danke für deine schnelle Antwort, aber leider funtioniert es nicht so ganz. Ich weiß nämlich nicht, welches Widget ich da einsetzen soll. Ich habe es jetzt mit einem QToolButton versucht, aber der wird nicht angezeigt, weder mit Text noch mit einem Icon. Eine QAction kann ich ja nicht einsetzen. Hier ist mein Code, vielleicht mach ich ja irgendwas falsch:

Code: Alles auswählen

	tabWidget = new QTabWidget(this);
	deleteButton = new QToolButton(this);
	deleteButton->setIcon(QIcon(":/icon_delTab.png"));
	tabWidget->setCornerWidget(deleteButton);
	setCentralWidget(tabWidget);
Oder gibt es ein spezielles Widget, das besser dafür geeignet ist?

Nochmal danke für deine Hilfe,
Isa
Vaaco
Beiträge: 21
Registriert: 12. Oktober 2006 11:51

Beitrag von Vaaco »

Der parent deines Toolbuttons muss dein TabWidget sein.
Also:
tabWidget = new QTabWidget(this);
deleteButton = new QToolButton(tabWidget);
Isa
Beiträge: 32
Registriert: 10. April 2006 13:18

Beitrag von Isa »

Und schon geht es. Ich hatte eigentlich gedacht, dass der Button dann automatisch in den richtigen parent verschoben wird, aber wohl nicht.

Grüße,
Isa
Eltharion
Beiträge: 74
Registriert: 4. Mai 2006 14:42
Wohnort: Magdeburg
Kontaktdaten:

Beitrag von Eltharion »

Du kannst auch ein Standard-Icon für den Button nehmen:

close_tab_button->setIcon(style()->standardIcon(QStyle::SP_TitleBarCloseButton));

E*
Isa
Beiträge: 32
Registriert: 10. April 2006 13:18

Beitrag von Isa »

Das wußte ich gar nicht, danke für den Hinweis. Hab die vorher nie gesehen!

Grüße,
Isa
defenderLQ
Beiträge: 156
Registriert: 27. Juli 2006 20:53

Beitrag von defenderLQ »

hi

so ein problem hab ich auch ich kann mein tabs nicht schliesen...
ich habe ein globalen tab im mainwindow und da werden die
tabs angehängt aber ich kann es nicht mehr schliessen

Code: Alles auswählen

/** testing tab methods**/
void MainWindow::addGroup()
{
	    tabWidget = new GroupsTabWidget(this);
	    deleteButton = new QToolButton(tabWidget);
	    deleteButton->setIcon(style()->standardIcon(QStyle::SP_TitleBarCloseButton)); 
	    //setCentralWidget(tabWidget);

		QString groupname = "Testing group";

		int nbtab = ui.tabWidget->count();

		for (int i = 0; i < nbtab; i++) {
		if (ui.tabWidget->tabText(i) == QString(tr("first tab"))) {
			//i is the index of the group tab
			groupsWidget = (GroupsWidget *) ui.tabWidget->widget(i);

			ui.tabWidget->setCurrentWidget(groupsWidget);
			return;
			}
		}

		activeTabBeforeCall = ui.tabWidget->currentWidget();

        groupsWidget = new GroupsWidget(ui.tabWidget, tabWidget);

		ui.tabWidget->addTab(groupsWidget, groupname);
		ui.tabWidget->setCurrentWidget(groupsWidget);




}

GroupsWidget * MainWindow::getActiveTabWidget()
{
	return dynamic_cast<GroupsWidget *>(ui.tabWidget->widget(ui.tabWidget->currentIndex()));
}


void MainWindow::activeTabChanged(int index)
{
	tabWidget->stopBlinkingTab(index);
	setWindowTitle(tabWidget->tabText(tabWidget->currentIndex()));

}
/** function to close the Active tab which is selected**/
void MainWindow::closeActiveTab()
{
	GroupsWidget *widget = getActiveTabWidget();
	int widgetPos = ui.tabWidget->indexOf(widget);
	ui.tabWidget->removeTab(widgetPos);
	delete(widget);
	//if (tabWidget->count() == 0) {

	//}
	// work around a Qt bug under Windows:
	// currentChanged is not emitted when removeTab is called
	//#ifdef OW_WINDOWS // IS THIS REALLY RIGHT?
		//activeTabChanged(ui.tabWidget->currentIndex());
	//#endif
	////
}
Isa
Beiträge: 32
Registriert: 10. April 2006 13:18

Beitrag von Isa »

Weiß jetzt nicht, ob meine PN angekommen ist. Zur Sicherheit hier nochmal:

Hi,

hab gerade deine Antwort im Forum gelesen. Hmm... so ähnlich wie du in closeActiveTab() habe ich es eigentlich auch gemacht. Der einzige Unterschied, der mir jetzt auffällt ist, dass du kein close aufrufst sondern das widget deletest nachdem du es aus dem TabWidget genommen hast. Versuch es vll. mal mit widget->close().
Oh und da fällt mir noch was auf: Du holst das aktuelle Widget mit getActiveTabWidget() und speicherst es in einer lokalen Variablen widget. Wenn du nun delete auf widget aufrufst, dann zerstörst du nur die lokale Kopie aber nicht das Tab selbst. Besser wäre vielleicht sowas: delete(getActiveTabWidget()) (wenn das geht) oder eben
getActiveTabWidget()->close(). Das war zumindest bei mir mal der Fall.
Was ich nicht ganz verstehe ist, was meinst du mit globales Tab?

Ich hoffe ich konnte dir etwas helfen.

Grüße,
Isa
defenderLQ
Beiträge: 156
Registriert: 27. Juli 2006 20:53

Beitrag von defenderLQ »

hi

es hat nicht geklappt...

ich habe das problem schon seit 2 monaten

Also ohne mein Tabwidget vom .ui gings mal und hat uach das close button
mal angezeigt....
aber die methode ein tab ins global tab mit close button ging bis jetzt noch nicht.
defenderLQ
Beiträge: 156
Registriert: 27. Juli 2006 20:53

Beitrag von defenderLQ »

nun ich kann bei mir was aktivieren aber der close button
erscheint nicht im ui.tabwidget sondern es kommt ein neuer
tabwidget und sieht man das da ein close button funktioniert.





Bild

Code: Alles auswählen

/** Constructor */
MainWindow::MainWindow(QWidget* parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
	/* Invoke the Qt Designer generated QObject setup routine */
	ui.setupUi(this);

	activeTabBeforeCall = NULL;


	ui.tabWidget = new GroupsTabWidget(this);
	ui.tabWidget->removeTab(1);
	//setCentralWidget(tabWidget);


	connect(ui.tabWidget, SIGNAL(closeButtonClicked()), SLOT(closeActiveTab()));
	connect(ui.tabWidget, SIGNAL(currentChanged(int)), SLOT(activeTabChanged(int)));

#if defined(OS_MACOSX) //why mac defined?
	// Add the close tab widget
	CloseGroupTabWidget *closeTabWidget = new CloseGroupTabWidget(ui.toolBar);
	ui.toolBar->addWidget(closeTabWidget);
	connect(closeTabWidget, SIGNAL(clicked()), this, SLOT(closeActiveTab()));
	////
#endif


	
}

und wenn ich ui.tabWidget = new GroupsTabWidget deaktiviere

Code: Alles auswählen

	//ui.tabWidget = new GroupsTabWidget(this);
	ui.tabWidget->removeTab(1);
Bild

Code: Alles auswählen

void MainWindow::addGroup()
{
	    tabWidget = new GroupsTabWidget(this); 
	    //setCentralWidget(tabWidget);

		QString groupname = "Testing group";

		int nbtab = ui.tabWidget->count();

		for (int i = 0; i < nbtab; i++) {
		if (ui.tabWidget->tabText(i) == QString(tr("first tab"))) {
			//i is the index of the conference tab
			groupsWidget = (GroupsWidget *) ui.tabWidget->widget(i);

			ui.tabWidget->setCurrentWidget(groupsWidget);
			return;
			}
		}

		activeTabBeforeCall = ui.tabWidget->currentWidget();

        groupsWidget = new GroupsWidget(ui.tabWidget, tabWidget);

		ui.tabWidget->addTab(groupsWidget, groupname);
		ui.tabWidget->setCurrentWidget(groupsWidget);




}

GroupsWidget * MainWindow::getActiveTabWidget()
{
	return dynamic_cast<GroupsWidget *>(ui.tabWidget->widget(ui.tabWidget->currentIndex()));
}


void MainWindow::activeTabChanged(int index)
{
	tabWidget->stopBlinkingTab(index);
	setWindowTitle(tabWidget->tabText(tabWidget->currentIndex()));

}
/** function to close the Active tab which is selected**/
void MainWindow::closeActiveTab()
{
	GroupsWidget *widget = getActiveTabWidget();
	int widgetPos = ui.tabWidget->indexOf(widget);
	ui.tabWidget->removeTab(widgetPos);
	//delete(getActiveTabWidget());
	delete(widget);
	//getActiveTabWidget()->close();
	//if (tabWidget->count() == 0) {

	//}
	// work around a Qt bug under Windows:
	// currentChanged is not emitted when removeTab is called
	//#ifdef OW_WINDOWS // IS THIS REALLY RIGHT?
		//activeTabChanged(ui.tabWidget->currentIndex());
	//#endif
	////
}
Antworten