2015-06-19 2 views
0

Я пытаюсь создать gui с QTabWidget с несколькими вкладками. В качестве предварительного теста я создал один, который имеет две вкладки, используя те же макеты. Первая вкладка (Страница 1) пуста, но вторая показывает QTableView, которую я создал. Оба вкладки были созданы точно так же, но они выполняются по-разному. Кто-нибудь знает, почему первый пуст ...?Вкладка QTabWidget ничего не отображает на одной из вкладок

Я заметил, что если я прокомментирую строку int8Window->setLayout(_layout);. Page 1 показывает, с правильной планировкой и закладка второй пустой в этот раз ...

Вот код для графического интерфейса:

// Main window and layout 
    QWidget* mainWindow = new QWidget; 
    QVBoxLayout *mainLayout = new QVBoxLayout; 

    // Tab widget 
    QTabWidget* tabWidget = new QTabWidget; 

    // The pages in the tab widget 
    QWidget* uInt8Window = new QWidget; 
    uInt8Window->setWindowTitle(QString("Page 1")); 
    QWidget* int8Window = new QWidget; 
    int8Window->setWindowTitle(QString("Page 2")); 

    QTableView* tableView = new QTableView; 
    QStandardItemModel* model = new QStandardItemModel(5, 5); 
    for (int row = 0; row < 5; ++row) { 
     model->setItem(row, 0, new QStandardItem("3")); 
     model->setItem(row, 1, new QStandardItem(5)); 
     model->setItem(row, 2, new QStandardItem(2)); 
     model->setItem(row, 3, new QStandardItem(1)); 
     model->setItem(row, 4, new QStandardItem(5)); 
    } 

    tableView->setModel(model); 

    // Setting the tab page layouts 
    _layout = new QVBoxLayout; 
    _layout->addWidget(tableView); 

    uInt8Window->setLayout(_layout); 
    int8Window->setLayout(_layout); 

    // Add the pages to the tab widget 
    tabWidget->addTab(uInt8Window, "Page 1"); 
    tabWidget->addTab(int8Window, "Page 2"); 

    // Add the tab widget to the main layout and show 
    mainLayout->addWidget(tabWidget); 
    mainWindow->setLayout(mainLayout); 
    mainWindow->show(); 

ответ

1

Читать журналы! Уверен, у вас есть соответствующее предупреждение.

Вы назначаете один и тот же макет двум различным виджетам. Как только макет назначается виджету, он принадлежит этому виджету навсегда.

Вам нужно создать отдельный макет для каждого виджета.

Я рекомендую разделить это на пару методов. Один создает виджет для страницы (вы можете использовать эту пару раз). Другое создание модели данных и другой компоновщик вкладок.

Пожалуйста, помните также об управлении памятью! Лучшим подходом является установка родителя во время построения (в качестве параметра конструктора). У вас есть утечка в модели данных.

+0

Хммм, ваш комментарий к управлению памятью. Я думал, Qt управляет памятью для вас и очищает память после закрытия окна gui? Прямо сейчас у моего конструктора есть эти аргументы 'testGUI (QWidget * parent = 0)' в файле заголовка. Это то, что вы имеете в виду? –

+0

, если вы правильно установите родителя. Qt использует шаблон управления памятью дерева. Объект автоматически удаляется, если его родитель был уничтожен. Если у объекта нет родителя, его нужно удалить другими способами. В вашем примере виджеты и макет устанавливаются родителями при добавлении их в макет или назначении виджетам соответственно. Модель данных здесь не имеет кода, который назначает родителя (модель может использоваться несколькими видами). –

+0

Итак, для объектов, у которых нет родителей, я должен их установить. То есть. 'QWidget * mainWindow = новый QWidget (родительский);', 'QTableView * tableView = новый QTableView (родительский);' и 'QStandardItemModel * model = new QStandardItemModel (5, 5, parent);'. –