QTabWidget erzeugt nur einen Tab

Alles rund um die Programmierung mit Qt
Antworten
B.C.
Beiträge: 15
Registriert: 28. Mai 2011 16:20

QTabWidget erzeugt nur einen Tab

Beitrag von B.C. »

Hallo,

egal, wie oft ich addTab() mit dem gleichen Widget als Parameter ausführe, wird trotzdem nur ein einziger Tab geöffnet. Ich habe dafür mal den relevanten Teil herauskopiert und in eine main-Datei gepackt, sodass es zum Testen sofort kompiliert und ausgeführt werden kann.

main.cpp

Code: Alles auswählen

#include <QtGui>

int main(int argc, char *argv[])
{

    QApplication app(argc, argv);

    ///////////////////////////////////////////////
    //Welcome Tab start
    ///////////////////////////////////////////////
    QTabWidget *tabWidget = new QTabWidget();
    tabWidget->setObjectName(QString::fromUtf8("tabWidget"));
    tabWidget->setDocumentMode(true);
    tabWidget->setTabsClosable(true);
    tabWidget->setMovable(true);
    QWidget *tab = new QWidget();
    tab->setObjectName(QString::fromUtf8("tab"));
    QHBoxLayout *horizontalLayout_4 = new QHBoxLayout(tab);
    horizontalLayout_4->setSpacing(0);
    horizontalLayout_4->setContentsMargins(0, 0, 0, 0);
    horizontalLayout_4->setObjectName(QString::fromUtf8("horizontalLayout_4"));
    QScrollArea *scrollArea = new QScrollArea(tab);
    scrollArea->setObjectName(QString::fromUtf8("scrollArea"));
    scrollArea->setFrameShape(QFrame::NoFrame);
    scrollArea->setFrameShadow(QFrame::Plain);
    scrollArea->setWidgetResizable(true);
    QWidget *scrollAreaWidgetContents = new QWidget();
    scrollAreaWidgetContents->setObjectName(QString::fromUtf8("scrollAreaWidgetContents"));
    scrollAreaWidgetContents->setGeometry(QRect(0, 0, 758, 480));
    QGridLayout *gridLayout = new QGridLayout(scrollAreaWidgetContents);
    gridLayout->setSpacing(6);
    gridLayout->setContentsMargins(11, 11, 11, 11);
    gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
    QSpacerItem *horizontalSpacer_2 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);

    gridLayout->addItem(horizontalSpacer_2, 1, 0, 1, 1);

    QSpacerItem *horizontalSpacer_3 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);

    gridLayout->addItem(horizontalSpacer_3, 1, 4, 1, 1);

    QSpacerItem *verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding);

    gridLayout->addItem(verticalSpacer, 0, 3, 1, 1);

    QSpacerItem *verticalSpacer_2 = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding);

    gridLayout->addItem(verticalSpacer_2, 2, 3, 1, 1);

    QFrame *frame = new QFrame(scrollAreaWidgetContents);
    frame->setObjectName(QString::fromUtf8("frame"));
    frame->setMinimumSize(QSize(650, 400));
    frame->setFrameShape(QFrame::StyledPanel);
    frame->setFrameShadow(QFrame::Raised);
    QLabel *label = new QLabel(frame);
    label->setObjectName(QString::fromUtf8("label"));
    label->setGeometry(QRect(20, 20, 91, 21));
    QLabel *label_2 = new QLabel(frame);
    label_2->setObjectName(QString::fromUtf8("label_2"));
    label_2->setGeometry(QRect(20, 70, 111, 16));
    QLabel *label_3 = new QLabel(frame);
    label_3->setObjectName(QString::fromUtf8("label_3"));
    label_3->setGeometry(QRect(20, 110, 341, 111));
    QLabel *label_4 = new QLabel(frame);
    label_4->setObjectName(QString::fromUtf8("label_4"));
    label_4->setGeometry(QRect(20, 230, 341, 111));
    QPushButton *pushButton = new QPushButton(frame);
    pushButton->setObjectName(QString::fromUtf8("pushButton"));
    pushButton->setGeometry(QRect(20, 360, 85, 27));
    QPushButton *pushButton_2 = new QPushButton(frame);
    pushButton_2->setObjectName(QString::fromUtf8("pushButton_2"));
    pushButton_2->setGeometry(QRect(110, 360, 85, 27));

    gridLayout->addWidget(frame, 1, 3, 1, 1);

    scrollArea->setWidget(scrollAreaWidgetContents);

    horizontalLayout_4->addWidget(scrollArea);

    ///////////////////////// HIER /////////////////////////
    tabWidget->addTab(tab, "Welcome");
    tabWidget->addTab(tab, "Welcome");
    ///////////////////////// HIER /////////////////////////
    // Es öffnet sich nur ein Tab //


    ///////////////////////////////////////////////
    //Welcome Tab end
    ///////////////////////////////////////////////

    tabWidget->show();

    return app.exec();
}
Ist erstmal ziemlich viel, hauptsächlich durch den Designer erzeugter Code.
Wie kann ich den hier designten Tab mehrmals öffnen?

MfG,
Basti
yarikata
Beiträge: 22
Registriert: 17. Mai 2011 16:40

Beitrag von yarikata »

ohayo gozaimasu,

dein Fehler ist das deine neuen Tabs keine Widgets sind.
Erstelle für jedes Tab ein Widget und füge es dann deinen QTabWidget hinzu.

Bsp.:

Code: Alles auswählen

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->setGeometry (200,200,200,200);

    qtabw =new QTabWidget(this);
    QWidget *Hello;
     QWidget *Hello2;
     QWidget *Hello3;



     Hello = new QWidget();
     Hello->setObjectName(QString::fromUtf8("Hello"));
     qtabw->addTab(Hello, "Dort");
     Hello2 = new QWidget();
     Hello2->setObjectName(QString::fromUtf8("Hello2"));
     qtabw->addTab(Hello2, "Holla ");
     Hello3 = new QWidget();
     Hello3->setObjectName(QString::fromUtf8("Hello3"));
     qtabw->addTab(Hello3, "BlaBla");



    qtabw->setGeometry (20,20,150,75);
}

MainWindow::~MainWindow()
{}
matane
B.C.
Beiträge: 15
Registriert: 28. Mai 2011 16:20

Beitrag von B.C. »

Hallo,

das ist wohl nicht das Problem, schau mal in Zeile 16:

Code: Alles auswählen

     QWidget *tab = new QWidget(); 
und denn Zeile 80ff

Code: Alles auswählen

     ///////////////////////// HIER ///////////////////////// 
     tabWidget->addTab(tab, "Welcome"); 
     tabWidget->addTab(tab, "Welcome"); 
     ///////////////////////// HIER ///////////////////////// 
Es wird ja so wie in deinem Beispiel gemacht. In dem Code wird allerdings auch das Layout, das den Inhalt des Widget darstellt, nicht per setLayout() zum tab hinzugefügt. Lediglich als Vater-Element ist es im Layout definiert. Das der erste Tab überhaupt funktioniert, wundert mich hier auch schon.
yarikata
Beiträge: 22
Registriert: 17. Mai 2011 16:40

Beitrag von yarikata »

Ah ok. Bei der Masse an Quellcode ging das unter.
Hast du es schon mit dem einzelnen Widget probiert?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Bitte den Code auf das Nötigste - sprich dein eigentliches Problem - beschränken.
Wenn es nur um das mehrfache Hinzufügen eines einzigen Widgets geht: Qt wird das verhindern. Jedes Widget hat seine eigene Resource, diese ist einmalig und kann nicht kopiert werden. QTabWidget verwaltet die Pages nicht selber (siehe z.B. auch removeTab).
Stell dir nur dieses eine Szenario vor:
Ein Widget wird mehrfach hinzugefügt. Ein Tab wird per removeTab() entfernt, andere Tabs zeigen aber immer noch das selbe Widget an. Was passiert, wenn das eine Widget nach dem remove zerstört wird? (Kann ja passieren) Dann gibts nen schönen SegFault...

Wenn also mehrfach das selbe angezeigt werden soll, musst du mehrere Instanzen davon erzeugen.
B.C.
Beiträge: 15
Registriert: 28. Mai 2011 16:20

Beitrag von B.C. »

Ah, vielen Dank, das erklärt alles. Dann werd ich mal ein wenig umstrukturieren...
Antworten