отображение экземпляра класса во вкладках в Qt - PullRequest
0 голосов
/ 08 августа 2011

Я пытаюсь отобразить 3 формы (календарь, история, статистика), которые имеют 3 класса в классе MainWindow, который имеет три вкладки, созданные с помощью дизайнера. Когда приложение запускается в первый раз, оно отображает форму истории на вкладке. Но когда он запускается во второй раз, форма отображается над вкладками, что они не видны.

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{

ui->setupUi(this);
CalenderForm *pCal = new CalenderForm();
lay = new QVBoxLayout(ui->tab);
lay->addWidget(pCal);
connect(ui->tabWidget,SIGNAL(currentChanged(int)),this,SLOT(a(int)));


}


void MainWindow::a(int index)
{
switch(index)
{
case 0:
    callCal();
    break;

case 1:
    callHist();
    break;

default:
    break;
}


}

void MainWindow::callHist()
{

    HistoryForm *pHis = new HistoryForm();
    pHis->DisplayHistory();
    pHis->show();
    lay2 = new QVBoxLayout(ui->tab_2);
    lay2->addWidget(pHis);
}

1 Ответ

1 голос
/ 08 августа 2011

Каждый раз, когда вы переключаете индекс вкладки, вы создаете новую форму.Я не уверен, является ли это причиной вашей проблемы, но это определенно проблема.

Вы должны убедиться, что формы создаются только один раз.Например, вы можете создать их в конструкторе MainWindow и сохранить указатели на них в переменных-членах.Вы также должны уже назначить там все необходимые макеты.

Когда вы переключаете индекс, вы просто вызываете DisplayHistory () или эквивалентный метод.

PS: Если вы все еще хотите понять свой код, следующийгод, вы, вероятно, должны найти более говорящее имя, чем «a» для этого слота; -)

[Edit] Вот пример заголовка и файла cpp.Имейте в виду, что он может не скомпилироваться как есть, и вам, возможно, придется внести некоторые изменения, но я хочу показать вам общую идею.

Заголовочный файл

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui/QMainWindow>

// forward declarations
class CalendarForm;
class HistoryForm;
class StatisticsForm; // or whatever your 3rd form is called

class MainWindow : QMainWindow
{
public:
    MainWindow(QWidget *parent);
    ~MainWindow();

private slots:

    void currentTabChanged( int tabIndex );

private:

    // these are called "member variables" as they are a member of a class
    // Sample naming convention: m_ for members, p for Pointer, you can use 
    // whatever you prefer, as long as you use it consistently.

    CalendarForm*   m_pCalendar;
    HistoryForm*    m_pHistory;
    StatisticsForm* m_pStatistics;


    // not sure about this part but it is generated by Qt anyway
    Ui::MainWindowClass* ui;


};

// not sure about this part but it is generated by Qt anyway
namespace Ui {
    class MainWindowClass;
}
#endif // MAINWINDOW_H

Файл CPP:

// these includes should be present already anyway
#include "MainWindow.h"
#include "ui_mainwindow.h"

#include "CalendarForm.h"
#include "HistoryForm.h"
#include "StatisticsForm.h"

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
    m_pCalendar   = new CalendarForm();
    m_pHistory    = new HistoryForm();
    m_pStatistics = new StatisticsForm();

    ui->tabWidget->addTab( m_pCalendar );
    ui->tabWidget->addTab( m_pHistory );
    ui->tabWidget->addTab( m_pStatistics );

    connect( ui->tabWidget, SIGNAL( currentChanged   ( int ) ),
             this         , SLOT  ( currentTabChanged( int ) );
}

MainWindow::~MainWindow()
{
    delete m_pCalendar;
    delete m_pHistory;
    delete m_pStatistics;
}

void MainWindow::currentTabChanged( int tabIndex )
{
    switch( tabIndex )
    {
    case 0:
        // update calculator if necessary
        break;
    case 1:
        // Assumption: You need to update the view every time you activate 
        // the tab. If this assumption is wrong, you don't need this slot
        // at all, just call the method once in the constructor.
        m_pHistory->DisplayHistory();
        break;
    case 2:
        // update statistics if necessary
        break;
    default:
        break;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...