QT, как добавить групповую коробку, которая содержит некоторые виджеты динамически с помощью кнопки?

У меня есть групповой ящик, который содержит некоторые кнопки и ползунки. Я хочу, чтобы, когда я нажимал на кнопку, новый групповой блок, такой же, как и предыдущий, появлялся под первым. Всякий раз, когда я нажимаю на кнопку, такая же ситуация должна происходить динамически. Так как мне нужно до 32 групповых блоков, я не хочу помещать все групповые блоки вручную. Итак, как я могу это сделать?

-1

Решение

Прежде всего, макет настоятельно рекомендуется.

Вот пример (я делал это раньше). Вы можете получить класс из QScrollArea, затем установите в конструкторе макеты, которые вы хотите иметь.

Здесь простая кнопка называется Add в окне.
Если вы нажмете ее, строка будет добавлена ​​и инициализирована со значениями по умолчанию (0, 0, 0) <- integers,
В живой программе я загружаю значения из файла / базы данных и затем инициализирую их.

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

//Structure to keep track of the added widgets easier
struct ItemRow
{
ItemRow(QLineEdit *entry, QLineEdit *amount, QComboBox *box)
: m_Entry(entry)
, m_Amount(amount)
, m_Box(box)
{ }

ItemRow(void)
: m_Entry(nullptr)
, m_Amount(nullptr)
, m_Box(nullptr)
{ }

QLineEdit *m_Entry;
QLineEdit *m_Amount;
QComboBox *m_Box;
};

Объявление класса.

class MyScrollArea : public QScrollArea
{
Q_OBJECT

public:
explicit MyScrollArea(QWidget *parent = 0);
~MyScrollArea();
//...
void OnAddButtonPressed(void);
void DrawButtonLayout(void);
void AddRow(int val1, int val2, int val3); //Use own parameters

private:
QVBoxLayout *m_LayoutFirstRow;
QVBoxLayout *m_LayoutSecondRow;
QVBoxLayout *m_LayoutThirdRow;
//...
QVBoxLayout *m_LayoutButton;
//...
QList<QPushButton*> m_Buttons;
QVector<ItemRow> m_ItemRows;
}

Реализация.

MyScrollArea::MyScrollArea(QWidget *parent) :
QScrollArea(parent),
ui(new Ui::MyScrollArea)
{
ui->setupUi(this);
setWidget(new QWidget);
setWidgetResizable(true);
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);

QHBoxLayout *mainLayout = new QHBoxLayout(this);

m_LayoutFirstRow    = new QVBoxLayout();
m_LayoutSecondRow   = new QVBoxLayout();
m_LayoutThirdRow    = new QVBoxLayout();
m_LayoutButton      = new QVBoxLayout();

widget()->setLayout(mainLayout);

mainLayout->addLayout(m_LayoutFirstRow);
mainLayout->addLayout(m_LayoutSecondRow);
mainLayout->addLayout(m_LayoutThirdRow);
mainLayout->addLayout(m_LayoutButton);

DrawButtonLayout();
}

RewardDialog::~RewardDialog()
{
delete ui;
}

void MyScrollArea::OnAddButtonPressed(void)
{
AddRow(0, 0, 0);
}

void MyScrollArea::DrawButtonLayout(void)
{
QPushButton *addBtn = new QPushButton("Add");
connect(addBtn, SIGNAL(clicked()), this, SLOT(OnAddButtonPressed()));
m_LayoutButton->addWidget(addBtn);
m_Buttons.push_back(addBtn); //Keep somewhere track of the button(s) if needed - example: put in QList (not the best approach though)
}

void MyScrollArea::AddRow(int val1, int val2, int val3)
{
QLineEdit *pEntry = new QLineEdit(QString::number(val1));
pEntry->setValidator(new QIntValidator());
QLineEdit *pAmount = new QLineEdit(QString::number(val2));
pAmount->setValidator(new QIntValidator());
QComboBox *pBox = new QComboBox();
InitComboBox(pBox, val3); //Initialize the combo-box (use connect if you wish) - code not included

m_LayoutFirstRow->addWidget(pEntry);
m_LayoutSecondRow->addWidget(pAmount);
m_LayoutThirdRow->addWidget(pBox);

ItemRow row;
row.m_Entry = pEntry;
row.m_Amount = pAmount;
row.m_Box = pBox;
m_ItemRows.push_back(row);
}

Оставьте комментарий, если что-то кажется неправильным, я собрал это в Notepad ++.

Примечание: ссылка на документацию предназначена для QT4.8, так как 5.3 больше не доступна, но мой код тоже с версии 5.3.

2

Другие решения


По вопросам рекламы [email protected]