Seite 1 von 1

ein externen tab in einen globalen tab adden per pushButton

Verfasst: 20. November 2006 16:00
von defenderLQ
hallo

1. Ich habe 2 verschiedene tabs das erste ist im mainwindow als Globales
tab im MainWindow.ui erstellt

Bild

und 2. eine weiteren tab extern im GroupsTab.ui
Bild

ich will per Button klick den externen tab in meinem Globalen tab angehängt haben.
Nun klappt es leider noch nicht mit:

Code: Alles auswählen

connect( ui.Buttonok, SIGNAL(clicked()), this, SLOT(addgrouptab())); 
[/b]

später wenn das klappen sollte, soll es per removeTab() wieder den tab entfernen.

hier mein sourcen:

Code: Alles auswählen

#include "JoinDialog.h"
#include "gui/groups/GroupsTab.h"
#include <QTabWidget>

/* Define the format used for displaying the date and time */
#define DATETIME_FMT  "MMM dd hh:mm:ss"



/** Default constructor */
JoinDialog::JoinDialog(QWidget *parent, Qt::WFlags flags)
  : QDialog(parent, flags)
{
  /* Invoke Qt Designer generated QObject setup routine */
  ui.setupUi(this);

  connect( ui.Buttonok, SIGNAL(clicked()), this, SLOT(addgrouptab()));

 
}

void 
JoinDialog::show()
{
  //loadSettings();
  if(!this->isVisible()) {
    QDialog::show();

  }
}

void JoinDialog::addgrouptab()
{
    tabWidget = new QTabWidget;
    tabWidget->addTab(new GroupsTab(), tr("General"));
}
mein header dazu:

Code: Alles auswählen

#include <QtGui>
#ifndef _JOINDIALOG_H
#define _JOINDIALOG_H

#include "ui_JoinDialog.h"

class JoinDialog : public QDialog
{
  Q_OBJECT

public:
  /** Default constructor */
  JoinDialog(QWidget *parent = 0, Qt::WFlags flags = 0);
  /** Default destructor */

public slots:
  /** Overloaded QWidget.show */
  void show();

protected:
  void closeEvent (QCloseEvent * event);
  
private slots:

  void addgrouptab();

private:

   QTabWidget *tabWidget;

   Ui::JoinDialog ui;
};

#endif
vom MainWindow.ui tab heist "tabWidget":

Code: Alles auswählen

 <widget class="QTabWidget" name="tabWidget" >
     
vom GroupTab.ui tab heist:"grouptabWidget"

Code: Alles auswählen

 "<widget class="QTabWidget" name="grouptabWidget" >"
das GroupsTab.ui befindet sich unter gui/groups/GroupTabs.ui/
das MainWindow.ui befindet such unter gui/MainWindow.ui/
mein JoinDialog.cpp/h befindet sich unter gui/join/JoinDialog.cpp/.h

nun habe ich nirgends was gelesen wie man von einem .ui das tab hinzufügen kann in einem mainwindow tab?

Verfasst: 20. November 2006 23:10
von defenderLQ
kennt sich keiner aus mit tabs?

ich hoffe ich habe mein problem gut geschildert?

Verfasst: 21. November 2006 11:00
von Burgpflanze
Eher wohl

Code: Alles auswählen

void JoinDialog::addgrouptab()
{
    ui.tabWidget->addTab(new GroupsTab(), tr("General"));
}

Verfasst: 21. November 2006 11:41
von defenderLQ
hi

also normal brauch ich nicht die ui. ich kann beides anwenden.
dann muss ich mein Dialog anpassen damit es vorne ui. immer steht.

nun stürzt mein gui ab wenn ich auf den buttonok klicke.

die includes im .cpp:

Code: Alles auswählen

#include "JoinDialog.h"
#include "gui/groups/GroupsTab.h"
#include "gui/MainWindow.h"
#include <QTabWidget>
das hier bringt zum absturz des guis:

Code: Alles auswählen

void JoinDialog::addgrouptab()
{  
    tabWidget->addTab(new GroupsTab(), tr("General"));
}
nun kann ins MainWindow ein GroupTab abgehängt werden damit überhaupt?

Verfasst: 23. November 2006 19:42
von defenderLQ
nun habe ich es so probiert:

Code: Alles auswählen

void JoinDialog::addgrouptab()
{  
    ui.tabWidget->addTab(ui.grouptabWidget , tr("General"));

}
nun ich habe so gedacht:

ins tabWidget im MainWindow wird grouptabWidget geaddet oder?

nun ein fehler:
gui\join\JoinDialog.cpp: In member function `void JoinDialog::addgrouptab()':
gui\join\JoinDialog.cpp:80: error: 'class Ui::JoinDialog' has no member named 'g
rouptabWidget'
gui\join\JoinDialog.cpp:80: error: 'class Ui::JoinDialog' has no member named 't
abWidget'
ich habe doch die include richtig angeben und es findet es nicht?

Verfasst: 25. November 2006 20:29
von defenderLQ
nun bin ich weiter aber der tab kommt nicht in tabwidget rein sondern
in ein neues.

wenn ich das aktiviere wird das addgroup hier ausgeführt:

Code: Alles auswählen

tabWidget = new GroupsTabWidget(this);
Bild

also meine andere tab function kann ins statische tab.
aber es hat nicht die function das die dazuhörige widget noch anzeigt und close tab.

Code: Alles auswählen

tabWidget = new GroupsTabWidget(this);
	//tabWidget->removeTab(0);
	//setCentralWidget(tabWidget);

    /** is for closing the active Tab when works! when get errors then disable it**/
	connect(ui.tabWidget, SIGNAL(closeButtonClicked()), SLOT(closeActiveTab()));
	connect(ui.tabWidget, SIGNAL(currentChanged(int)), SLOT(activeTabChanged(int)));

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

	//Telling users to send errors...
	cout<<"\nIf you see any errors below this line, send it to developers.\n---------------------------------------------------------------"<<endl;
}

Code: Alles auswählen

/** Testing if tabs works but at the moment without any groupwidget**/
void MainWindow::addatab()
{
    GroupsTabWidget * groupsTabWidget;

	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
			groupsTabWidget = (GroupsTabWidget *) ui.tabWidget->widget(i);
			//qtContactCallListWidget->addPhoneCall(qtPhoneCall);
			ui.tabWidget->setCurrentWidget(groupsTabWidget);
			return;
		}
	}
	
	activeTabBeforeCall = ui.tabWidget->currentWidget();
	//tab not found, create a new one
	groupsTabWidget = new GroupsTabWidget();
    ui.tabWidget->addTab(groupsTabWidget, tr("first tab"));
	ui.tabWidget->setCurrentWidget(groupsTabWidget);

}
/** testing tab, this function must be open a new tab with the GroupsWidget**/
void MainWindow::addgroup()
{
		QString groupname = "new group";
		int tabNumber;
		
        groupsWidget = new GroupsWidget(tabWidget, tabWidget);

		if (tabWidget->count() > 0) {
			tabNumber = tabWidget->insertTab(tabWidget->count(), groupsWidget, groupname);
		} else {
			tabNumber = tabWidget->insertTab(0, groupsWidget, groupname);
		}

		//if (session->isUserCreated()) {
			tabWidget->setCurrentIndex(tabNumber);
		//}
		
		setWindowTitle(tabWidget->tabText(tabNumber));
		
}



GroupsWidget * MainWindow::getActiveTabWidget()
{
	return dynamic_cast<GroupsWidget *>(tabWidget->widget(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 = tabWidget->indexOf(widget);
	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
	activeTabChanged(tabWidget->currentIndex());
#endif
	////
}
nun wo hab ich was falsch gemacht?

Verfasst: 26. November 2006 14:24
von defenderLQ
wenn ich mein addgroup erweitere:

Code: Alles auswählen

tabWidget = new GroupsTabWidget(this);
	    tabWidget->removeTab(0);
		setCentralWidget(tabWidget);
dann wird mein tabWidget vom .ui von der neuen überdeckt
bei nem klick auf add Tab button.

Code: Alles auswählen

void MainWindow::addgroup()
{

		tabWidget = new GroupsTabWidget(this);
	    tabWidget->removeTab(0);
		setCentralWidget(tabWidget);
		QString groupname = "new group";
		int tabNumber;

        groupsWidget = new GroupsWidget(tabWidget, tabWidget);

		if (tabWidget->count() > 0) {
			tabNumber = tabWidget->insertTab(tabWidget->count(), groupsWidget, groupname);
		} else {
			tabNumber = tabWidget->insertTab(0, groupsWidget, groupname);
		}

		//if (session->isUserCreated()) {
			tabWidget->setCurrentIndex(tabNumber);
		//}

		setWindowTitle(tabWidget->tabText(tabNumber));

}
ich will anhängen und nicht darauf.

Verfasst: 27. November 2006 12:19
von Christian81
Ich kenn mich damit leider nicht gut mit aus. Allerdings würde ich
a) immer addTab nehmen - Du emulierst ja quasi addTab
b) mir mal das Beispiel in qt-4/examples/dialogs/tabdialog anschauen - evtl. findest du dort ja was.
c) anstatt ein eigenes TabWidget einfach mal QWidget nehmen -> tabWidget->addTab(new QWidget, "Testwidget") und schauen was passiert. Damit kannst Du dann zumindest ein paar Fehlerquellen ausschliessen.

Verfasst: 27. November 2006 14:42
von defenderLQ
hi

nun habe ich es doch hinbekommen leider wird jetzt das closebutton nicht mehr angezeigt .

ich hatte gedacht es geht nur mit insertTab

Code: Alles auswählen

/** testing tab methods**/
void MainWindow::addGroup2()
{
	    tabWidget = new GroupsTabWidget(this);
	    tabWidget->removeTab(0);
	    //setCentralWidget(tabWidget);

		QString groupname = "group2";
		
		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);
		

		

}

danke für die infos.

Also ich hatte schon den tabdialog example schon vor paar tagen angeschaut.