2017-01-23 53 views
0

假设我有一个单独的文本框和一个单选按钮放置在文本框的下方。哪个UI项目可以在Qt中进行动态扩展?

我想那是什么如果用户输入一些文字和ALSO点击单选按钮类似文本框单选按钮应该出现的正下方。如果用户为新的UI项目执行此操作,则会发生类似的事情。

任何建议我应该寻找什么类?

+1

您可以添加使用信号和槽使其可见一个隐藏的控制,你的用户界面。我在少数情况下已经这样做了。 – drescherjm

+0

[布局](https://doc.qt.io/qt-5/layout.html)? – peppe

+0

这只会做一次,或者如果你在新的文本框中键入的东西,并按新的按钮应该显示新的? – eyllanesc

回答

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; 
};