Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Generated buttons, Hiding button text upon a button press



  • I generate buttons for each entry in a json file like this

            QJsonDocument document = QJsonDocument::fromJson(jsonData);
            QJsonObject object = document.object();
    
            QJsonValue value = object.value("Device");
            QJsonArray array = value.toArray();
            foreach (const QJsonValue & v, array)
            {
                QPushButton *button = new QPushButton(this);
    
                button->setObjectName("DeviceButton0");
                button->setMinimumHeight(46);
                button->setMaximumHeight(46);
                button->setText(v.toObject().value("Name").toString());
    
                ui->VB_LedStrip_Container->addWidget(button);
            }
    

    So when i press a certain button i set the width of this menu so that ONLY the icon of the buttons shows but i can see the first character in the button text! and i can't set the width lower (for design reasons) so my question is.

    • How would you go about hiding the text of every button in this menu when the button is pressed and when the button is pressed again to show the menu, show the text in the button again.

  • Lifetime Qt Champion

    Hi
    You could store the buttons in a QList so you can loop over them to set/reset text as needed.
    When you assign the text the first time
    button->setText(v.toObject().value("Name").toString());
    you also store the text in a dynamic property
    button->setProperty("orgtext", button->text() );

    that way you can hide it by setting it to empty text and then you have the text in the property to restore it when needed.

    Alternative 2 is to make a custom QPushButton with custom paintEvent where you can tell it to draw text or not.



  • @mrjj said in Generated buttons, Hiding button text upon a button press:

    Hi
    You could store the buttons in a QList so you can loop over them to set/reset text as needed.
    When you assign the text the first time
    button->setText(v.toObject().value("Name").toString());
    you also store the text in a dynamic property
    button->setProperty("orgtext", button->text() );

    that way you can hide it by setting it to empty text and then you have the text in the property to restore it when needed.

    Alternative 2 is to make a custom QPushButton with custom paintEvent where you can tell it to draw text or not.

    that is cool, so let me get this right if i would do

    button->setText("");
    

    i can do

    button->setProperty("orgtext", button->text());
    

    to get the original text back? or did i get that wrong?



  • @mrjj i did this

    mainwindow.h

    List<QPushButton*> m_DeviceButtonList;
    

    mainwindow.cpp

            QJsonDocument document = QJsonDocument::fromJson(jsonData);
            QJsonObject object = document.object();
    
            QJsonValue value = object.value("Device");
            QJsonArray array = value.toArray();
            foreach (const QJsonValue & v, array)
            {
                QPushButton *button = new QPushButton(this);
    
                button->setObjectName("DeviceButton0");
                button->setMinimumHeight(46);
                button->setMaximumHeight(46);
                button->setText(v.toObject().value("Name").toString());
    
                ui->VB_LedStrip_Container->addWidget(button);
    
                m_DeviceButtonList.append(button);
            }
    
            for (QPushButton * dButtons : m_DeviceButtonList)
            {
                qDebug() << "Found : " << dButtons;
            }
    

    and i get this

    Found :  QPushButton(0x9ec5c8, name="DeviceButton0")
    Found :  QPushButton(0x978840, name="DeviceButton0")
    Found :  QPushButton(0x598d030, name="DeviceButton0")
    Found :  QPushButton(0x598ccd0, name="DeviceButton0")
    Found :  QPushButton(0x598d7c8, name="DeviceButton0")
    

    i thought each button would get a unique object name? like

    DeviceButton0
    DeviceButton1
    DeviceButton2
    DeviceButton3
    ....


  • Lifetime Qt Champion

    Hi
    button->setProperty("orgtext", button->text());
    stores the text into a dynamic property,. ( the orgtext name)

    button->setText( button->property("orgtext").toString()   );
    

    would set the text back.

    Regarding the naming
    you set it to
    button->setObjectName("DeviceButton0");
    so all will get same name.

    You will need to add the number manually.
    something like

    int cc=0;
    foreach (const QJsonValue & v, array)
            {
                QPushButton *button = new QPushButton(this);
               button->setObjectName("DeviceButton"+ QString::number(cc++));
    ...
    

    But else you seem on the right track. :)



  • @mrjj said in Generated buttons, Hiding button text upon a button press:

    button->property("orgtext").toString()

    this didn't work for some reason :S

            for (QPushButton * dButtons : m_DeviceButtonList)
            {
                dButtons->setText( dButtons->property("orgtext").toString() );
            }
    

  • Lifetime Qt Champion

    @Kris-Revi
    In what way didn't work?



  • @mrjj

    So on button press i remove the text

    void MainWindow::on_B_ToggleMenu_clicked()
    {   
        if (ui->B_ToggleMenu->isChecked() == true)
        {
            for (QPushButton * dButtons : m_DeviceButtonList)
            {
                dButtons->setText("");
            }
        }
        else
        {
            for (QPushButton * dButtons : m_DeviceButtonList)
            {
                dButtons->setText( dButtons->property("orgtext").toString() );
            }
        }
    }
    

    but the text never shows :S


  • Lifetime Qt Champion

    @Kris-Revi said in Generated buttons, Hiding button text upon a button press:

    but the text never shows

    When you never set the property how do you expect that there is text in it?



  • @Christian-Ehrlicher said in Generated buttons, Hiding button text upon a button press:

    @Kris-Revi said in Generated buttons, Hiding button text upon a button press:

    but the text never shows

    When you never set the property how do you expect that there is text in it?

    @mrjj said in Generated buttons, Hiding button text upon a button press:

    Hi
    You could store the buttons in a QList so you can loop over them to set/reset text as needed.
    When you assign the text the first time
    button->setText(v.toObject().value("Name").toString());
    you also store the text in a dynamic property
    button->setProperty("orgtext", button->text() );

    that way you can hide it by setting it to empty text and then you have the text in the property to restore it when needed.

    Alternative 2 is to make a custom QPushButton with custom paintEvent where you can tell it to draw text or not.

    When you assign the text the first time
    button->setText(v.toObject().value("Name").toString());
    you also store the text in a dynamic property
    button->setProperty("orgtext", button->text() );

    did i read this wrong? was it supposed to be

    you should also store the text in a dynamic property ?


  • Lifetime Qt Champion

    Hi
    Yes. you should also store it in the property as else it will just be empty.
    So when you create teh buttons, also do and have set the text.
    button->setProperty("orgtext", button->text() );

    foreach (const QJsonValue & v, array)
            {
                QPushButton *button = new QPushButton(this);
    
                button->setObjectName("DeviceButton0");
                button->setMinimumHeight(46);
                button->setMaximumHeight(46);
                button->setText(v.toObject().value("Name").toString());
                button->setProperty("orgtext", button->text() ); // store a copy
    ......1
    

Log in to reply