QPushButton inside a tab of QTabWidget



  • we are using QTabWidget with 3 tabs

    tabs are used for showing the values for different devices

    tabs are called Device1Tab, Device2Tab, Device3Tab

    inside the tab , reading & showing values for respective device.
    in each tab, we have few labels, to show the values & a pushButton.

    values shall be shown when the pushbutton in that tab is pressed.
    we have used following code line

    connect(this, SIGNAL(Device2Tab->GetDataButton_pressed()), this, SLOT(updateData()));
    

    is this correct?

    while accessing the label in a tab, do we have to prefix the tab name?

    Edit: Added code tags -- @Wieland



  • Not required. You need to give the pointer to QObject as argument for connect. You can look at documentation.



  • No, close, but not quite correct,

    connect(object1, signalX, object2, slotY);
    

    this is not the object in this case, but the button is.

    in your case:

    //connect(object1, signalX, object2, slotY);
    connect(Device2Tab->GetDataButton, SIGNAL(pressed()), this, SLOT(updateData()));
    


  • In addition to what said @J-Hilk, Idea is that if you have reference to QObject directly, you can the reference the object directly. Once you specify the QObject pointer as first argument, while specifying the signal you don't have to specify the QObject reference again.



  • @J.Hilk
    when
    connect(Device2Tab->GetDataButton, SIGNAL(pressed()), this, SLOT(updateData()));
    is used, it gives the error 'class QWidget' has no member named 'GetDataButton'

    when it is used as
    connect(this->GetDataButton, SIGNAL(pressed()), this, SLOT(updateData()));

    compiling, shows tabs, but when GetDataButton is pressed, it is crashing.



  • @o6a6r9v1p

    thats actually to be expected behaviour.

    The old SIGNAL(), SLOT() syntax checks during runtime and not compile time.

    Anyway, I don't know how your Device2Tab and GetDataButton are created.

    For example:
    If you use the designer, than the correct pointer to the button would be

    connect(ui->GetDataButton, SIGNAL(pressed()), this, SLOT(updateData()));
    

    If you create it from code:

    QPushButton *GetDataButton = new  QPushButton(Device2Tab);
    

    than you'll have to write:

    void MyClass::SomeFunction() {
       QPushButton *GetDataButton = new  QPushButton(Device2Tab);
        ....
        //Button Specifications
        ...
        connect(GetDataButton, SIGNAL(pressed()), this, SLOT(updateData()));
    }
    


  • What is Device2Tab ? Is it QTableWidget class ? If yes, it will not have GetDataButton variable.

    Looks like GetDataButton is QPushButton type variable in side your widget class and you have not allocated memory for the same.

    Can you paste the complete code sample on this ?



  • @dheerendra
    to make the program short, i removed code for device3 tab. it is written in same way as for other two tabs.

    @
    //demo.h

    class DemoApp : public QWidget
    {
    Q_OBJECT

    public:
    ----
    QPushButton *sGetDataButton;
    QPushButton *smoreButton;

    QDialogButtonBox *sbuttonBox;

    QTabWidget *DashBoard = new QTabWidget();
    QWidget *Device1Tab= new QWidget();
    QWidget *Device3Tab= new QWidget();
    QWidget *Device2Tab= new QWidget();

    ----
    -----
    

    float valueTemp;
    float valueBV, valueBCI;
    float valueLV;
    }
    @

    @
    //demo.cpp
    DemoApp::DemoApp(QWidget *parent) :
    QWidget(parent) // QMainWindow(parent)
    {
    // QWidget *
    // window = new QWidget(this);

    DashBoardGui();
    

    QVBoxLayout *mainLayout = new QVBoxLayout;
    mainLayout->addWidget(DashBoard);
    window->setWindowTitle("Device Monitor");
    window->setLayout(mainLayout); //vertical
    window->resize(320,240);
    window->show();
    connect(this->sGetDataButton, SIGNAL(pressed()), this, SLOT(updateSettings()));
    }

    void DemoApp::DashBoardGui()
    {
    device1Tab();
    device2Tab();

    DashBoard->addTab( Device1Tab, tr("Device1"));
    DashBoard->addTab( Device2Tab, tr("Device2"));
    

    }

    void DemoApp::device1Tab()
    {

    QLabel *LabelBV = new QLabel(tr("Battery Voltage(V):"));
    
    LabelBV_Value = new QLabel(tr("        "));
    LabelBV_Value ->setFixedWidth(80);
    
    LabelBV_Value->setFrameStyle(QFrame::Panel | QFrame::Sunken);
    
    QLabel *LabelBCI = new QLabel(tr("Battery Current(A):"));
    LabelBCI_Value = new QLabel(tr("        "));
    LabelBCI_Value->setFrameStyle(QFrame::Panel | QFrame::Sunken);
    
    
    QVBoxLayout *VLayout1 = new QVBoxLayout;
     QVBoxLayout *VLayout2 = new QVBoxLayout;
      QVBoxLayout *VLayout3 = new QVBoxLayout;
       QHBoxLayout *HLayout1 = new QHBoxLayout;
       QHBoxLayout *HLayout2 = new QHBoxLayout;
    
       VLayout1->addWidget(LabelBV);
       VLayout2->addWidget(LabelBV_Value);
    
       VLayout1->addWidget(LabelBCI);
       VLayout2->addWidget(LabelBCI_Value);
    
       HLayout1->addLayout(VLayout1);
       HLayout1->addLayout(VLayout2);
    
       HLayout2->addLayout(HLayout1);
       HLayout2->addLayout(VLayout3);
    
    QPushButton *GetDataButton1 = new QPushButton(tr("&GetData"));
    GetDataButton1->setDefault(true);
    
    QPushButton *moreButton1 = new QPushButton(tr("&More"));
    moreButton1->setCheckable(true);
    moreButton1->setAutoDefault(false);
    
    QDialogButtonBox *buttonBox1 = new QDialogButtonBox(Qt::Horizontal);
    buttonBox1->addButton(GetDataButton1, QDialogButtonBox::ActionRole);
    buttonBox1->addButton(moreButton1, QDialogButtonBox::ActionRole);
    
    
    QVBoxLayout *mainLayout = new QVBoxLayout;
    QHBoxLayout *mainLayout3 = new QHBoxLayout;
    QVBoxLayout *mainLayout1 = new QVBoxLayout;
    QVBoxLayout *mainLayout2 = new QVBoxLayout;
    
    mainLayout->addLayout(HLayout2);
    

    // mainLayout->addLayout(mainLayout3); /////
    mainLayout->addWidget(buttonBox);
    //mainLayout->addStretch(1);
    Device1Tab->setLayout(mainLayout); // HLayout2

    }

    void DemoApp::updateDevicetab1()
    {
    valueBV=12.34;
    valueBCI=2.19;
    LabelBV_Value->setText( QString::number(valueBV, 'f', 3));
    LabelBCI_Value->setText( QString::number(valueBCI, 'f', 3));
    }

    void DemoApp::device2Tab()
    {

    QLabel *sLabelTemp = new QLabel(tr("Temperature(C):"));
    QLabel *sLabelTemp_Value = new QLabel(tr("12345      "));
    sLabelTemp_Value->setFrameStyle(QFrame::Panel | QFrame::Sunken);
    QHBoxLayout *sHLayout1 = new QHBoxLayout;
    
    sHLayout1->addWidget(sLabelTemp);
    sHLayout1->addWidget(sLabelTemp_Value);
    QVBoxLayout *smainLayout = new QVBoxLayout;
    QHBoxLayout *smainLayout3 = new QHBoxLayout;
    QVBoxLayout *smainLayout1 = new QVBoxLayout;
    QVBoxLayout *smainLayout2 = new QVBoxLayout;
    
    smainLayout1->addLayout(sHLayout1);
    sGetDataButton = new QPushButton(tr("&GetData"));
    sGetDataButton->setDefault(true);
    
    
    smoreButton = new QPushButton(tr("&More"));
    smoreButton->setAutoDefault(false);
    
    
    QDialogButtonBox *sbuttonBox = new QDialogButtonBox(Qt::Horizontal);
    sbuttonBox->addButton(sGetDataButton, QDialogButtonBox::ActionRole);
    sbuttonBox->addButton(smoreButton, QDialogButtonBox::ActionRole);
    
    
    smainLayout3->addLayout(smainLayout1);
    smainLayout3->addLayout(smainLayout2);
    
    smainLayout->addLayout(smainLayout3);
    

    // mainLayout->addLayout(mainLayout3); /////
    smainLayout->addWidget(sGetDataButton);
    smainLayout->addStretch(1);
    Device2Tab->setLayout(smainLayout);

    }

    void DemoApp::updateDevicetab2()
    {
    valueTemp=62.37;

    sLabelTemp_Value->setText( QString::number(valueTemp, 'f', 3));

    }

    when ''GetData'' pushbutton is pressed, respective ''updateDevicetabx()'' is to invoked.

    can you tell me where i am wrong.



  • @o6a6r9v1p said in pushButton inside a tab of tabWidget:

    connect(this->sGetDataButton, SIGNAL(pressed()), this, SLOT(updateSettings()));

    this is now:
    connect(this->sGetDataButton, SIGNAL(pressed()), this, SLOT(updateDevicetab2()));



  • @o6a6r9v1p

    move

    connect(this->sGetDataButton, SIGNAL(pressed()), this, SLOT(updateSettings()));
    

    from the constructor to

    void DemoApp::device2Tab()
    

    and shorten it to

    connect(sGetDataButton, SIGNAL(pressed()), this, SLOT(updateSettings()));
    

    and it should work as intendet.



  • @J.Hilk
    thanks for the quick help.
    but the program crashes when getdata button is pressed.
    I will go through program & check it.



  • @J.Hilk
    this worked fine with device1Tab.
    When same is extended to deviceTab2, compiling without eerors. When pushbutton on deviceTab2 is presses, it is crashing. In wahtever manner, it is done in deviceTab1, in the same way code in deviceTab2 is done. Where shall I look for possible mistakes.



  • @o6a6r9v1p
    Got the problem, the label is to declared public. it is working fine.
    Thanks to all


Log in to reply
 

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