ein externen tab in einen globalen tab adden per pushButton

Alles rund um die Programmierung mit Qt
Antworten
defenderLQ
Beiträge: 156
Registriert: 27. Juli 2006 20:53

ein externen tab in einen globalen tab adden per pushButton

Beitrag 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?
defenderLQ
Beiträge: 156
Registriert: 27. Juli 2006 20:53

Beitrag von defenderLQ »

kennt sich keiner aus mit tabs?

ich hoffe ich habe mein problem gut geschildert?
Burgpflanze
Beiträge: 89
Registriert: 24. Februar 2006 16:41
Wohnort: Dresden

Beitrag von Burgpflanze »

Eher wohl

Code: Alles auswählen

void JoinDialog::addgrouptab()
{
    ui.tabWidget->addTab(new GroupsTab(), tr("General"));
}
Gruß, Peter
defenderLQ
Beiträge: 156
Registriert: 27. Juli 2006 20:53

Beitrag 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?
defenderLQ
Beiträge: 156
Registriert: 27. Juli 2006 20:53

Beitrag 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?
defenderLQ
Beiträge: 156
Registriert: 27. Juli 2006 20:53

Beitrag 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?
defenderLQ
Beiträge: 156
Registriert: 27. Juli 2006 20:53

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
defenderLQ
Beiträge: 156
Registriert: 27. Juli 2006 20:53

Beitrag 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.



Antworten