我正在Qt中创建一个应用程序,允许用户在QGraphicsView中拖动各种"模块".每当选择其中一个模块时,它会发出一个信号,然后由"ConfigurationWidget"拾取,这是一个侧面板,应该显示所选模块的所有相关参数:
class ConfigurationWidget : public QWidget
{
Q_OBJECT
public:
ConfigurationWidget(QWidget *parent) : QWidget(parent) {}
public slots:
void moduleSelected(Module* m)
{
if(layout())
{
while (itsLayout->count()>0)
{
delete itsLayout->takeAt(0);
}
}
delete layout();
itsLayout = new QFormLayout(this);
itsLayout->addRow(QString(tr("Type:")), new QLabel(m->name()));
itsLayout->addRow(QString(tr("Instance:")), new QLabel(m->instanceID()));
// ... Display a whole bunch of other fields that depends on the module
}
};
Run Code Online (Sandbox Code Playgroud)
问题是当选择模块时,ConfigurationWidget实际上永远不会被清除.新字段只是绘制在旧字段上.我尝试过hide()和show(),invalidate(),update()等各种组合无济于事.
制作可以动态改变其字段的小部件的正确方法是什么?
Wes*_*ker 29
我以前用过的代码循环如下:
void clearLayout(QLayout *layout) {
QLayoutItem *item;
while((item = layout->takeAt(0))) {
if (item->layout()) {
clearLayout(item->layout());
delete item->layout();
}
if (item->widget()) {
delete item->widget();
}
delete item;
}
}
Run Code Online (Sandbox Code Playgroud)
希望这对你有所帮助!
如果将布局转移到堆栈上分配的另一个窗口小部件,则该布局中的窗口小部件将成为新窗口小部件的子窗口.当临时对象超出范围时,它会自动销毁布局及其中的所有小部件.
void moduleSelected(Module* m)
{
if(layout())
QWidget().setLayout(layout());
itsLayout = new QFormLayout(this);
itsLayout->addRow(QString(tr("Type:")), new QLabel(m->name()));
itsLayout->addRow(QString(tr("Instance:")), new QLabel(m->instanceID()));
// ... Display a whole bunch of other fields that depends on the module
}
Run Code Online (Sandbox Code Playgroud)
看起来最好的方法是使用 QStackedLayout,正如 armonge 所暗示的那样:
void ConfigurationWidget::moduleSelectedSlot(Module* m)
{
QStackedLayout *stackedLayout = qobject_cast<QStackedLayout*>(layout());
QWidget *layoutWidget = new QWidget(this);
QFormLayout *formLayout = new QFormLayout(layoutWidget);
formLayout->addRow(QString(tr("Type:")), new QLabel(m->name()));
formLayout->addRow(QString(tr("Instance:")), new QLabel(m->instanceID()));
// ... Display a whole bunch of other fields that depends on the module
delete stackedLayout->currentWidget();
stackedLayout->addWidget(layoutWidget);
stackedLayout->setCurrentWidget(layoutWidget);
}
Run Code Online (Sandbox Code Playgroud)