哪个UI项允许在Qt中随时随地进行动态扩展?

时间:2017-01-23 17:00:01

标签: c++ qt user-interface

假设我在文本框下方放置了一个文本框和一个单选按钮

我想要的是如果用户输入一些文字而点击单选按钮类似的文本框单选按钮应该出现在下面。如果用户为新UI项目执行此操作,则会发生类似情况。

有什么建议我应该寻找哪些课程?

1 个答案:

答案 0 :(得分:0)

您需要处理插入新窗口小部件的相关类是QLayout子类之一,听起来很可能是QVBoxLayout。这将允许您在布局的底部插入一个新的文本框和单选按钮,然后自动展开以适应这些新的小部件。

插入新对象非常简单。将插槽连接到布局底部QRadioButton的信号,如QRadioButton::toggledQRadioButton::clicked信号。此插槽将检查上面的文本框中是否包含任何文本,如果是,则在其下方插入新的文本框/单选按钮对。

要清楚,此插槽应该是窗口小部件的一种方法,它使用布局来排列其子窗口小部件。例如,如果您将所有这些对象放在QGroupBox中,那么这就是您要添加我所描述的广告位的对象。

这是一个(未经测试的)示例:

class Group : public QGroupBox {
    Q_OBJECT

    public:
        Group(QWidget* parent = nullptr) : QGroupBox(parent)
        {
            layout = new QVBoxLayout(this);
            insertNewRow();
        }

    private slots:
        void insertNewRow(bool checked = true) {
            /* You might want to make this remove the row if the button is unchecked */
            if (!checked) 
                return;

            /* Only add row if text box is non-empty */
            if (textBoxes.isEmpty() || textBoxes.last()->text().isEmpty())
                return;

            /* Disconnect slot for previous radio button */
            QObject::disconnect(radioButtons.last(), 0, 0, 0);

            /* Add new text box and button, labeled Button 1, Button 2, etc. */
            textBoxes.append(new QLineEdit("", this));
            radioButtons.append(new QRadioButton(QString("Button %1").arg(textBoxes.size())), this));

            /* Connect signal/slot to add new row when clicked */
            QObject::connect(radioButtons.last(), &QRadioButton::toggled, this, &Group::insertNewRow);
        }

    private:
        QVBoxLayout* layout;
        QList<QLineEdit*> textBoxes;
        QList<QRadioButton*> radioButtons;
};