2015-09-03 17 views
-1

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

+0

Вам когда-нибудь удалось создать что-то динамически в 'C++'? –

+0

вам нужно создать событие с сигналами и слотами – Megasa3

+0

Я положил listwidget и вставлял в него имена файлов динамически. @victorpolevoy. Итак, следует ли написать функцию слота в C++ или вы упомянули что-то другое? Также какой тип события я должен сделать? – qwerty

ответ

2

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

Вот пример (я сделал это раньше). Вы можете получить класс от 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); 
} 

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

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

+0

Я понял, но у меня есть еще один вопрос. У меня в группе есть несколько слайдеров и кнопок. Когда я добавляю новый групповой пакет динамически, должен ли я добавлять все ползунки и кнопки вручную или есть ли лучшее решение для этого? – qwerty

+0

Просто создайте функцию типа «AddRow» или назовите ее «AddGroupBox» и обработайте добавление нового группового поля плюс элементы управления внутри этой функции. Таким образом, вы должны делать только простой вызов функции добавления. (С параметрами или без них, это ваше решение) Вы * можете * добавить макет в групповой ящик тоже. – Blacktempel

+0

Благодарим за хорошее решение. Тогда это последний вопрос. Я разместил макет, а затем область прокрутки. Но во-первых, мой групповой пакет охватывает весь макет, а затем, когда я добавляю новый групповой пакет, размер их уменьшается, и полосы прокрутки еще не установлены. В чем проблема? – qwerty