Seite 1 von 1

Qt3->Qt4 TabBar mit Rechtsklick/Context Menu

Verfasst: 16. Januar 2006 14:45
von lagro
Hallo,

ich habe folgendes problem...
meine anwendung hat ein tabwidget mit meiner eigenen tabBar die ich beim initialisieren des TabWidgets setze. dies ist notwendig da die tabbar auf rechtsklicks bzw. auf das contextMenuEvent reagieren soll. es soll ähnlich wie bei firefox ein popupmenu (QMenu in Qt4) aufploppen und man soll features wie "close tab" etc. haben. das menu aufspringen zu lassen ist kein problem, lediglich festzustellen über welchem tab/reiter geklickt wurde ist etwas knifflig. mit Qt3 war das kein problem. man konnte sich dank der methode selectTab( QPoint ) das QTab geben lassen, welches sich an der übergeben position befand.

bloß wie mach ich das unter Qt4?!!!!
es gibt die klasse QTab schonmal gar nicht mehr. man kann sich nur noch so sachen wie currentIndex (vom aktuell aktiven tab) geben lassen. mich würde aber der indexwert des tabs interessieren auf das ich rechts geklickt habe und nicht der vom aktiven tab. selectTab gibts nicht. indexOf gibts nicht... ich hab keine ahnung wie ich das nun lösen soll. es muss doch in Qt4 möglich sein, wenn es in Qt3 schon möglich war.

vor allem wird ein solches menu häufig verwendet.
trolltech hat aber in ihrem assistant noch immer tab reiter ohne contextMenu und man muss blöd den schließen knopf drücken. jedenfalls hab ich den assistant jetzt mal durchgesucht und nix passendes gefunden zu dem thema. vielleicht hab ich auch was übersehen!

danke schonmal für eure bemühungen!

lagro

Verfasst: 11. September 2006 12:02
von Anton
Das Kontext-Menü auf dem Reiter (Tab) eines TabWidgets, das von QTabWidget abgeleitet wurde habe ich wie folgt gelöst:

Code: Alles auswählen

class TabWorkspace : public QTabWidget
{
	Q_OBJECT
private:
	QMenu	tabCntxtMenu;
.
.
	QMenu& refTabContextMenu(){return tabCntxtMenu;}
	void contextMenuEvent( QContextMenuEvent *event );
.
.
};

void TabWorkspace::contextMenuEvent(QContextMenuEvent *event)
{
	if (TabWorkspace::count() && (event->reason() == QContextMenuEvent::Mouse))
	{
 		QTabBar *tabBar = QTabWidget::tabBar();
		if (tabBar->geometry().contains(event->pos()))
		{
			QPoint relPos = event->pos() - tabBar->geometry().topLeft();
			for (int i = 0; i < tabBar->count(); i++)
			{
				QRect tabRect = tabBar->tabRect(i);
				if (tabRect.contains(relPos))
				{
					if (i != currentIndex())
					{
						setCurrentIndex(i);
						currentWidget()->show();
					}
					break;
				}
			}
			tabCntxtMenu.exec(event->globalPos());
		}
		else
			event->ignore();
	}
	else
		event->ignore();
}

diese Antwort kommt zwar sehr spät, aber vielleicht hift's trotzdem.
Anton

Danke

Verfasst: 11. September 2006 13:15
von lagro
In der Tat etwas spät ;)
Habe das Problem mittlerweile gelöst.
Bin durch Zufall auch auf QRect gestoßen und damit ging es dann.

Trotzdem vielen dank!