Nasty Phoenix
Nasty Phoenix

Reputation: 17

C++ Qt add multiple widget like QPushButton with variable Names

I want to add some Widget (QPushButton for example) in my central Widget inside a layout

I can do it with :

QPushButton *but1 = new QPushButton(ui->centralwidget);
    but1->setText("button1");
    ui->audiolayout->addWidget(but1);

Now my problem is that I don't know how many buttons I will have to create because it depends of the results of another function.

So what I want to do is each new button is named like

name = but + functionresult

int but_index;
for (but_index = 1; but_index < functionresult; but_index++)
{
QPushButton *butfunctionresult = new QPushButton(ui->centralwidget);
}

I can't find the correct way to do this

Upvotes: 0

Views: 317

Answers (1)

Wisblade
Wisblade

Reputation: 1644

Widget's name isn't in QWidget, but in QObject.

Use setObjectName(QString("but%1").arg(functionresult)), or something similar, to set a proper name for your button, setText(...) for the string displayed on the button itself, and store them in a vector (if you don't need to access individually to each button by name), or a map (if you need to access them by name).

Example:

// Use only ONE of these containers, no need to have the two.
QVector<QPushButton*> anonymousStorage ;    // Access buttons through their index.
QMap<QString,QPushButton*> namedStorage ;   // Access buttons through an internal name.

for (auto but_index = 1 ; but_index < functionresult ; but_index++) {
    // Build the two required strings: internal name + display name.
    // "extfunc1" and "extfunc2" should return something suitable: string, integer, ... according to the current index.
    QString name = QString("button%1").arg(extfunc1(but_index)) ;
    QString display = QString("Button %1").arg(extfunc2(but_index)) ;

    // Create the button.
    auto newbut = new QPushButton(ui->centralwidget) ;
    newbut->setObjectName(name) ;
    newbut->setText(display) ;
    // Insert here any call to "connect" or other customization functions.

    // Store the new button inside ONE of these containers.
    anonymousStorage->push_back(newbut) ;
    namedStorage[name] = newbut ;
}

To retrieve / use them:

// Click on button 12 - assuming you checked it exists before, obviously...
anonymousStorage[12]->click() ;

// Click on button "Commit" - assuming you checked it exists before, obviously...
namedStorage["buttonCommit"]->click() ;

Upvotes: 0

Related Questions