Seite 1 von 1
QTabWidget: kleines Icon in der rechten Ecke
Verfasst: 19. Oktober 2006 16:03
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
Verfasst: 19. Oktober 2006 16:11
von upsala
Code: Alles auswählen
QTabWidget::setCornerWidget(QWidget *widget, Qt::Corner corner=Qt::TopRightCorner)
Verfasst: 20. Oktober 2006 09:40
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
Verfasst: 20. Oktober 2006 13:47
von Vaaco
Der parent deines Toolbuttons muss dein TabWidget sein.
Also:
tabWidget = new QTabWidget(this);
deleteButton = new QToolButton(tabWidget);
Verfasst: 20. Oktober 2006 14:27
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
Verfasst: 27. Oktober 2006 14:31
von Eltharion
Du kannst auch ein Standard-Icon für den Button nehmen:
close_tab_button->setIcon(style()->standardIcon(QStyle::SP_TitleBarCloseButton));
E*
Verfasst: 27. Oktober 2006 14:37
von Isa
Das wußte ich gar nicht, danke für den Hinweis. Hab die vorher nie gesehen!
Grüße,
Isa
Verfasst: 31. Januar 2007 14:41
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
////
}
Verfasst: 31. Januar 2007 15:21
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
Verfasst: 31. Januar 2007 16:43
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.
Verfasst: 31. Januar 2007 21:26
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.
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);
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
////
}