[Solved]creating tabs



  • hi

    Im new to creating widgets programmatically. I got the application running but no tabs were created

    This is my code
    @
    Tabs::Tabs(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Tabs)
    {
    ui->setupUi(this);
    tabWidget = new QTabWidget;
    tabWidget->addTab(new QWidget,tr("History"));
    tabWidget->addTab(new QWidget,tr("Calender"));
    tabWidget->addTab(new QWidget,tr("Statistics")) ;
    mainLayout = new QVBoxLayout;
    mainLayout->addWidget(tabWidget);
    setLayout(mainLayout);

    }
    @
    and in the header file
    I've declared the following
    @
    QTabWidget *tabWidget;
    QVBoxLayout *mainLayout;
    @

    alfah



  • Include the header where HistoryTab and others are declared.



  • cincirin,

    I got rid of the errors but have the program running, but i cant find any tabs created.
    Jus a blank screen !! :(

    alfah



  • Use this instead of last line in your ctor
    @
    centralWidget->setLayout(mainLayout);
    @



  • denis,

    i can jus use centralWidget?? wat is it??

    i get the follwing error " invalid use of member".

    alfah


  • Moderators

    I think you need to use
    @setCentralWidget @ first



  • :( it does work tht way either.



  • oops, I meant
    @
    centralWidget()->setLayout(mainLayout);
    @

    Eddy, looks like it is form created from designer, so central widget should be there.



  • Tabs is the class derived from QMainWindow ? Can you show us the header and part of the code where you instantiate the Tabs class ?



  • :D :D yeaa denis i got it right, Thank you!

    so if i want to create buttons in the history tab? how to i go abt it???. I meant how do i acces each tab separately??

    alfah


  • Moderators

    Did you use it like this ? :

    this is the way moc does it when looking in the ui_tabs.h file
    @centralwidget = new QWidget(Tabs); // it is just a temporary name
    ...
    Tabs->setCentralWidget(centralwidget);@

    @Denis
    Yes, you are right!

    EDIT : too late ;)



  • eddy,

    @
    Tabs::Tabs(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Tabs)
    {
    ui->setupUi(this);
    tabWidget = new QTabWidget;
    tabWidget->addTab(new QWidget,tr("History"));
    tabWidget->addTab(new QWidget,tr("Calender"));
    tabWidget->addTab(new QWidget,tr("Statistics"));
    mainLayout = new QVBoxLayout;
    mainLayout->addWidget(tabWidget);
    centralWidget()->setLayout(mainLayout);

    }
    @

    i still do not know how to make individual buttons on each tab :(

    alfa


  • Moderators

    have a look at
    12Of()@



  • @QTabWidget::widget(int index)@ return the tab page.
    Then you can create buttons with returned parent.



  • u mean tabWidget->indexOf()???

    But i have not named each tab:(



  • [quote author="alfah" date="1312355523"]eddy,

    @
    Tabs::Tabs(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Tabs)
    {
    ui->setupUi(this);
    tabWidget = new QTabWidget;
    tabWidget->addTab(new QWidget,tr("History"));
    tabWidget->addTab(new QWidget,tr("Calender"));
    tabWidget->addTab(new QWidget,tr("Statistics"));
    mainLayout = new QVBoxLayout;
    mainLayout->addWidget(tabWidget);
    centralWidget()->setLayout(mainLayout);

    }
    @

    i still do not know how to make individual buttons on each tab :(

    alfa
    [/quote]

    You can event add custom widgets to the tab widget, so go this way:

    @
    Tabs::Tabs(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Tabs)
    {
    ui->setupUi(this);
    tabWidget = new QTabWidget;

    QWidget* pHistory = new QWidget;
    // fill pHistory here
    QPushButton* p = new QPushButton(tr("my text"), pHistory);
    
    
    tabWidget->addTab(pHistory,tr("History"));
    tabWidget->addTab(new QWidget,tr("Calender"));
    tabWidget->addTab(new QWidget,tr("Statistics"));
    mainLayout = new QVBoxLayout;
    mainLayout->addWidget(tabWidget);
    centralWidget()->setLayout(mainLayout);
    

    }
    @


  • Moderators

    in that case use cinrin's solution :

    for example :

    @ QPushButton* ppp = new QPushButton("testing" );
    QHBoxLayout* hhh = new QHBoxLayout();
    hhh->addWidget(ppp);
    ui->tabWidget->widget(1)->setLayout(hhh);@

    I set up an example layout for you to control size and position.

    EDIT : this time Gerolf was faster ;)



  • gerolf,

    yea i could make buttons. Now im working on somethin a bit more complex than a single button.
    I have made a calender using an array of buttons, its the same thing like the default calender.

    Would it be possible to put in the whole calender in to one of the tab, jus as you have created a single button.???
    It requires mainly 4 funtions to create the whole calender
    @
    initMemberVariable();

    initMonthYear();
    
    initWeekDay();
    
    createLayout();
    

    @

    @
    bool CalenderForm::initMemberVariable()
    {

    selectedDate=QDate::currentDate();
    
    controlsLayout = new QGridLayout();
    
    monthValue=selectedDate.month();
    
    pLabelStatus=new QLabel;
    
    pLabelStatus->setStyleSheet("color:black");
    
    
    for(int i=0;i<6;i++)
    {
        for(int j=0;j<7;j++)
        {
    
           cellBut[i][j]=new QPushButton(this);
           connect(cellBut[i][j],SIGNAL(clicked()),this,SLOT(onClickAction()));
           cellBut[i][j]->setFlat(true);
    
        }
    }
    return true;
    

    }
    @

    This is where the buttons are created. I want them to be created in the calender tab.

    Could you guide me on how to go abt it?

    alfa



  • eddy :)

    yeaa a wee bit faster. could you check on the above posts and give your opinion?

    alfah



  • [quote author="Eddy" date="1312356252"]in that case use cinrin's solution :

    for example :

    @ QPushButton* ppp = new QPushButton("testing" );
    QHBoxLayout* hhh = new QHBoxLayout();
    hhh->addWidget(ppp);
    ui->tabWidget->widget(1)->setLayout(hhh);@

    I set up an example layout for you to control size and position.

    EDIT : this time Gerolf was faster ;)[/quote]

    what is widget(1)??



  • [quote author="alfah" date="1312359027"]what is widget(1)??[/quote]
    @
    QWidget* historyTab = tabWidget->widget(0);
    QWidget* calenderTab = tabWidget->widget(1);
    QWidget* statisticsTab = tabWidget(2);
    @



  • ahh ok,
    thanks cincirin


  • Moderators

    bq. This is where the buttons are created. I want them to be created in the calender tab.
    Could you guide me on how to go abt it?

    try this

    @ QGridLayout* grid = new QGridLayout();

    for(int i=0;i<6;i++)     {
        for(int j=0;j<7;j++)         {
            cellBut[i][j]=new QPushButton(QString("%1 , %2").arg(i).arg(j));
            connect(cellBut[i][j],SIGNAL(clicked()),this,SLOT(onClickAction()));
            cellBut[i][j]->setFlat(true);
            grid ->addWidget(cellBut[i][j],i,j);
        }
    }
    
    ui->tabWidget->widget(1)->setLayout(grid );@


  • Thanks everybody :)

    got it fixed :) this is wat Ive used jus in case somebody else needs it. My calender is put in vlayout. so my tabwidget has now the vLayout.

    @

    QVBoxLayout *vLayout=new QVBoxLayout;
    tabWidget = new QTabWidget;
    QWidget* pCalender = new QWidget;
    QWidget* pHistory = new QWidget;
    QWidget* pStatistics= new QWidget;
    tabWidget->addTab(pCalender,tr("Calender"));
    tabWidget->addTab(pHistory,tr("History"));
    tabWidget->addTab(pStatistics,tr("Statistics"));
    tabWidget->widget(0)->setLayout(vLayout);
    

    @

    Last one, how to show another form when i click a tab. I have a function to show the history form. how do i call the functionwithout having to put a button on the History Tab??? :(

    alfah

    EDIT : i meant History Tab


  • Moderators

    Great you made it.

    bq. Last one, how to show another form when i click a tab. I have a function to show the history form.

    Why do you want to do that? it's not clear for users they can access forms this way. Why don't you use a button for this?



  • eddy
    There is an EDIT in my previous post :) I meant history tab not history form.

    I have made these tabs at the top to replace two buttons i have in the form.
    Its easier to switch between the tabs, so i have history button which when clicked goes to another form, the history form.

    Now im tryin to put the same thing into the tab. ie when I click the history tab, it should go to the history form
    This is my function which opens the history form
    @
    bool CalenderForm::showHistoryFrm()
    {

    HistoryForm *hHistoryFrm=new HistoryForm;
    hHistoryFrm->show();
    setCentralWidget(hHistoryFrm);
    hHistoryFrm->DisplayHistory();
    return true;
    delete hHistoryFrm;
    

    }
    @

    alfah



  • can i do somethin like this/?
    @
    tabWidget->widget(1)->connect(tabWidget->widget(1),SIGNAL(clicked()),this,SLOT(showHistoryFrm()));
    @


  • Moderators

    bq. Now im tryin to put the same thing into the tab. ie when I click the history tab, it should go to the history form
    This is my function which opens the history form

    What I meant is this is not good GUI design in my opinion. People using your program don't expect to click on a Tab to open a form. If I were you I would stick to the button solutions which you already have. There you can add icon/text saying "this buttons opens form..." or whatever you like. It will be more straightforward.
    BTW : the tabwidget doesn't have a clicked signal. I think it's intended that way for the reason I tried to explain.



  • connect() function was automatically shown when i typed in tabWidget->widget(1) so there should be some function right?

    does tabwidget have any other signals tht can be used?

    well, i need to show the some history data when the history tab is pressed :( :( any other options than buttons?? It will look odd if there is jus a button in the history tab which when clicked will shoe the historyform :(

    alfah


  • Moderators

    bq. well, i need to show the some history data when the history tab is pressed :( :( any other options than buttons?? It will look odd if there is jus a button in the history tab which when clicked will shoe the historyform :(

    why not put that form in that tab instead?

    yes there are other signals of course. The best way to find them is to use Qt Designer and use the "Edit signals slots" button or F4 to see them. for more info see the QT Designer manual.



  • to put the form in the tab meaning??


  • Moderators

    If you only have a button in the Tab and the only purpose for that button is to open another form, then you could eliminate that button and show the widgets immediately in your Tab.

    If you don't understand what I'm saying, maybe you could show us an image of your form and an image of the tab where the button is in?



  • I found a signal currentChanged for TabWidget, but i cant find out how to use it?

    Any idea???

    docs said

    Qt Signal Documentation

    @void currentChanged (int)
    @
    This is the default overload of this signal.

    This signal is emitted whenever the current page index changes. The parameter is the new current page index position, or -1 if there isn't a new one (for example, if there are no widgets in the QTabWidget)


  • Moderators

    currentChanged will be invoked anytime you click on another tab than the current one. I don't think that is what you want or is it?



  • :(

    yeaa u r right.

    I tried using the following code, but then the same form is shown when both statics tab as well as the history tab is clicked even though i have connected two different forms
    :(
    @
    tabWidget->widget(1)->connect(tabWidget,SIGNAL(currentChanged(int)),this,SLOT(showHistoryFrm()));
    tabWidget->widget(2)->connect(tabWidget,SIGNAL(currentChanged(int)),this,SLOT(showOptionFrm()));
    @

    alfah


  • Moderators

    I think I don’t understand what you want exactly, maybe you could show us an image of your form ?



  • Rather than creating a new thread I thought its better this way,

    @

    tabWidget->setTabIcon(0,QIcon(":images\clock.png"));

    @

    The above code should set an icon in the first tab right?? But apparently its not!. I've put the image in the resource file.
    ???

    any idea

    alfah


  • Moderators

    I think you missed a ""

    Try this :
    @tabWidget->setTabIcon(0,QIcon(":\images\clock.png")); @



  • '' did not do the trick :(


  • Moderators

    @tabWidget->setTabIcon(0,QIcon(":/images/clock.png")); @

    works for me on the simulator.

    the / or \ depends on your OS


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.