Seite 1 von 1
[gelöst] QTabWidget: Zugriff aufs Tab
Verfasst: 6. Juni 2011 01:13
von B.C.
Hi,
ich habe als Grundgerüst zB so etwas:
Code: Alles auswählen
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QTextEdit *edit = new QTextEdit(ui->tabWidget);
ui->tabWidget->addTab(edit, "Titel");
}
Die Variable edit sei mir nicht bekannt, wie kann ich jetzt die Methode setText vom Editor im aktuellen Tab aufrufen? Mit currentWidget() komm ich zwar ans Widget aber iwie auch nicht weiter ... Wie stellt man sowas jetzt an?
Verfasst: 6. Juni 2011 08:41
von Mani99
Ich würde dem textedit mit setObjectName() einen namen verpassen und dann im currentWidget() per findChild danach suchen!
Code: Alles auswählen
QTextEdit *edit = myTab->currentWidget()->findChild<QTextEdit*>("MyTextEditName");
Verfasst: 6. Juni 2011 08:47
von franzf
Wenn das oben keine absolut vereinfachte Version deines Problems ist:
Warum willst du das edit nicht als Member speichern? Tut doch nicht weh.
Außerdem kannst du die Tabs auch leicht direkt im Designer einrichten, also gleich dort das TxetEdit einfügen.
Verfasst: 6. Juni 2011 14:22
von B.C.
@franzf
Die Idee hatte ich vorher auch, allerdings muss man dann den Tabindex zusammen mit dem editor abspeichern, funktioniert soweit auch mit ner zB QMap. Selbst mit dem Löschen der Tabs geht alles noch. Sobald man die Tabs allerdings verschieben darf, wird das schon etwas komplizierter, da dann der Index im QMap geupdatet werden muss.
@Mani99
Danke, ich versuche das denn mal.
Verfasst: 6. Juni 2011 14:57
von B.C.
Die Idee von Mani99 funktioniert anscheinend nicht ...
Code: Alles auswählen
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QTextEdit *edit = new QTextEdit(ui->tabWidget);
edit->setObjectName("CodeEditor");
ui->tabWidget->addTab(edit, "Titel");
QTextEdit *editor = ui->tabWidget->currentWidget()->findChild<QTextEdit *>("CodeEditor");
editor->setText("hhh");
}
Das gibt nen Programmabsturz.
Was ich vorhabe: Einen TextEditor, der mit mehreren Tabs arbeitet, und dafür muss ich auf die Funktionen des QTextEdits zugreifen, das im Tab drin ist. Die Tabs werden natürlich dynamisch erstellt und entfernt.
Verfasst: 6. Juni 2011 15:08
von Christian81
Merk Dir einen Pointer auf das QTextEdit im MainWindow so wie es franzf gesagt hat und fertig! Und wenn Du Dir nur den Index merken willst kannst Du mit QTabWidget::widget(int) auf das einzelne TabWidget zugreifen.
addTab() fügt zwar ein Tab hinzu aber es steht nirgends das dieses Tab dann auch das currentTab ist... des weiteren ist nach deinem Code currentWidget() schon das QTextEdit und nicht ein child davon.
Verfasst: 6. Juni 2011 15:18
von B.C.
Hi,
Code: Alles auswählen
des weiteren ist nach deinem Code currentWidget() schon das QTextEdit und nicht ein child davon.
Nein, es ist ein QWidget. Ich schaffe es iwie nicht, von dort aus aufs QTextEdit zu kommen ...
Es werden ja mehrere Tabs geöffnet, müsste mir also alle editoren davon per Pointer merken. Und damit ich weiß, welches von den ganzen editoren das aktuelle ist, muss ich das Index mitspeichern, um bei einem Tabwechsel wieder darauf zu kommen. Das ist aber nicht gerade die schöne Lösung, wäre ziemlich umständlich.
Verfasst: 6. Juni 2011 15:29
von Mani99
B.C. hat geschrieben:
Code: Alles auswählen
des weiteren ist nach deinem Code currentWidget() schon das QTextEdit und nicht ein child davon.
Nein, es ist ein QWidget. Ich schaffe es iwie nicht, von dort aus aufs QTextEdit zu kommen ...
Nein, das currentWidget() ist schon das QTextEdit ...
D.h. das currentWidget() kann kein child haben das "CodeEditor" editor heißt! Und wenn du auf das gecastete QTextEdit zugreifen willst, ohne das du überprüfst, ob es überhaupt exisitert, ist klar das das programm abschmiert!
Verfasst: 6. Juni 2011 16:28
von Christian81
B.C. hat geschrieben:Hi,
Code: Alles auswählen
des weiteren ist nach deinem Code currentWidget() schon das QTextEdit und nicht ein child davon.
Nein, es ist ein QWidget. Ich schaffe es iwie nicht, von dort aus aufs QTextEdit zu kommen ...
Fang mal bitte bei den C++ Grundlagen an...

Verfasst: 6. Juni 2011 17:35
von B.C.
Code: Alles auswählen
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QTextEdit *edit = new QTextEdit(ui->tabWidget);
edit->setObjectName("CodeEditor");
ui->tabWidget->addTab(edit, "Titel");
QTextEdit *editor = ui->tabWidget->currentWidget();
editor->setText("j");
}
Fehlermeldung: Invalid conversion 'QWidget*' to 'QTextEdit*'
Wohl doch kein QTextEdit ...

Verfasst: 6. Juni 2011 17:44
von Christian81
Nur weil ein Pointer auf ein QWidget zurückkommt und kein QTextEdit heißt es noch lange nicht dass es kein QTextEdit ist. Dann dürfte QTabWidget::addTab(QWidget*) ja auch kein QTextEdit - Pointer akzeptieren -> C++ Grundlagen.
Abgesehen davon sollte man sich schon überlegen wie man auf die einzelnen QTextEdit zugreift - irgendwie muss man sie am Ende ja auseinanderhalten. Also ein wenig Planung muss schon sein. Da können wir aber nicht helfen da Du zu wenig zur Aufgabenstellung geschrieben hast.
Verfasst: 6. Juni 2011 22:46
von B.C.
Hab das Problem nun so gelöst:
Code: Alles auswählen
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QTextEdit *edit = new QTextEdit(ui->tabWidget);
edit->setObjectName("CodeEditor");
ui->tabWidget->addTab(edit, "Titel");
QTextEdit *editor = qobject_cast<QTextEdit *>(ui->tabWidget->currentWidget());
editor->setText("Test");
}