【问题标题】:Qt - Dynamically create, read from and destroy widgets (QLineEdit)Qt - 动态创建、读取和销毁小部件 (QLineEdit)
【发布时间】:2016-12-13 11:37:33
【问题描述】:
我有以下情况:
我有 QSpinBox,我的应用程序的用户可以在其中选择他想要创建的项目的多少个实例。在下一步中,他必须为每个项目指定一个名称。我想通过动态创建一些与用户在 SpinBox 中选择的数字相对应的 QLabels 和 QLineEdits 来解决这个问题。所以,当数字上升时,我想添加新的 LineEdits,当数字下降时,我想删除现在过时的 LineEdits。
好吧,你猜怎么着——这比我预期的要困难得多。我在网上搜索过,但结果令人失望。似乎没有简单的方法来动态创建、维护(可能在列表中?)和销毁这些小部件。谁能指出我正确的方向如何做到这一点?
【问题讨论】:
标签:
qt
widget
dynamically-generated
【解决方案1】:
花点时间检查一下QListWidget,它使用QListWidgetItem 为您提供了您真正想要的功能。
一个小例子:这个函数将一个新元素添加到一个QListWidget,定义了QWidget作为视图并返回当前索引:
QModelIndex MainWindow::addNewItem(QWidget* widget) {
QListWidgetItem* item = new QListWidgetItem;
ui->listWidget->addItem(item1);
ui->listWidget->setItemWidget(item, widget);
return ui->listWidget->indexFromItem(item);
}
现在,如果您的用户选择 X 个项目,您应该迭代创建 X 个小部件,您可以将所有小部件保存在 QList:
listWidget.clear();
for (int i=0; i<X; i++) {
QTextEdit* edit = new QTextEdit();
const QModelIndex& index = addNetItem(edit);
qDebug() << "New element: " << index;
listWidget.append(edit);
// Handle edit text event
connect(edit, SIGNAL(textChanged()), this, SLOT(yourCustomHandler()));
}
现在,只显示包含所有编辑字段的列表。