替换Qt中的小部件

Bre*_*men 4 c++ user-interface inheritance qt qwidget

我有一个基类,它有一些gui项目,我已设置在Qt创建者中使用设计器的位置.这些项目是:

QWidget* w1;
QWidget* w2;
QWidget* w3;
Run Code Online (Sandbox Code Playgroud)

现在在继承该基类的类中,我想将这些小部件"转换"为lineEdit项,这将保留该小部件的所有几何参数.所以我这样做:

QLineEdit* leAmplitude;
leAmplitude = new QLineEdit(ui->w1);
leAmplitude->setGeometry(ui->w1->geometry());
ui->glControls->addWidget(leAmplitude);
Run Code Online (Sandbox Code Playgroud)

但添加的QLineEdit项目不会出现在与w1项目完全相同的位置.它只是添加在QGridLayoutglControls 中其他控件的底部.如何使lineEdit从w1获取所有几何参数?

hyd*_*yde 8

布局根据窗口小部件提供的提示来处理放置在布局中的窗口小部件,因此调用setGeometry然后执行操作addLayout是没有用的.此外,向布局添加窗口小部件会将其重置为父窗口,因此将新窗口小部件的父窗口设置为ui->w1也无效.

幸运的是,有QLayout :: replaceWidget方法!只是使用它.例:

QLineEdit* leAmplitude;
leAmplitude = new QLineEdit;
QLayoutItem *previous = ui->glControls->replaceWidget(ui->w1, leAmplitude);
// possibly assert that previous is ui->w1, or just delete it, or whatever
Run Code Online (Sandbox Code Playgroud)

这个方法是在Qt 5.2中添加的,所以如果你需要支持旧版本,我可以扩展这个答案,以涵盖如何(尝试)手动执行相同的操作.但简而言之,您必须使用正确的QGridLayout :: addWidget重载并确保相关属性(至少包括sizeHintsizePolicy)匹配.