[gelöst] QTabWidget: Zugriff aufs Tab

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
B.C.
Beiträge: 15
Registriert: 28. Mai 2011 16:20

[gelöst] QTabWidget: Zugriff aufs Tab

Beitrag 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?
Zuletzt geändert von B.C. am 6. Juni 2011 22:46, insgesamt 1-mal geändert.
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Beitrag 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");
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
B.C.
Beiträge: 15
Registriert: 28. Mai 2011 16:20

Beitrag 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.
B.C.
Beiträge: 15
Registriert: 28. Mai 2011 16:20

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

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

'Funktioniert nicht' ist keine Fehlerbeschreibung
B.C.
Beiträge: 15
Registriert: 28. Mai 2011 16:20

Beitrag 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.
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

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

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

'Funktioniert nicht' ist keine Fehlerbeschreibung
B.C.
Beiträge: 15
Registriert: 28. Mai 2011 16:20

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

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

'Funktioniert nicht' ist keine Fehlerbeschreibung
B.C.
Beiträge: 15
Registriert: 28. Mai 2011 16:20

Beitrag 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");
}
Antworten