【问题标题】:qt how to add a groupbox that contains some widgets dynamically with a pushbutton?qt如何使用按钮动态添加包含一些小部件的组框?
【发布时间】:2015-09-03 07:25:17
【问题描述】:

我有一个包含一些按钮和滑块的组框。我希望当我单击一个按钮时,一个与前一个相同的新组框应该出现在第一个下。每当我点击按钮时,同样的情况应该动态发生。由于我需要多达 32 个这样的 groupbox,我不想手动放置所有 groupbox。那么,我该怎么做呢?

【问题讨论】:

  • 你有没有设法在c++ 中动态创建一些东西?
  • 你需要用信号和槽创建一个事件
  • 我放了一个列表小部件并在其中动态插入文件名。 @victorpolevoy。那么,我应该用 C++ 编写一个槽函数还是你提到了一些不同的东西?另外我应该制作哪种事件类型?
  • 您只需要在c++ 代码中动态创建小部件并将它们放入同一个父小部件中。你有很多方法可以实现这一目标。
  • 但是我想在另一个小部件下添加新小部件,如何安排小部件的位置?

标签: c++ qt qt-designer qt5.3 qgroupbox


【解决方案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 版。

【讨论】:

  • 我明白了,但我还有一个问题。我有一个包含一些滑块和按钮的组框。当我动态添加新的分组框时,我应该手动添加所有滑块和按钮还是有更好的解决方案?
  • 只需像我一样创建一个函数AddRow 或将其命名为AddGroupBox 并处理在函数内部添加一个新的组框和控件。所以你只需要在外面做一个简单的调用 add 函数。 (带或不带参数,由您决定)您也可以在组框中添加布局。
  • 感谢您的出色解决方案。那么,这是最后一个问题。我放了一个布局,然后放了一个滚动区域。但首先我的 groupbox 覆盖了所有布局,然后每当我添加一个新的 groupbox 时,它们的大小都会减小并且仍然没有滚动条。可能是什么问题?
  • 您是否使用了setWidgetResizable 并设置了它的大小策略?否则它不会展开。
  • 我将 setwidgetresizable 设置为打开并将大小策略设置为首选。这是真的还是我应该将它们设置为其他东西?
猜你喜欢
  • 2020-11-25
  • 1970-01-01
  • 2020-04-18
  • 2021-01-28
  • 1970-01-01
  • 2019-06-27
  • 2019-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多