我对此代码有一个小问题:
DatasetWidget::DatasetWidget(QWidget *parent) : QWidget(parent),
ui(new Ui::DatasetWidget)
{
ui->setupUi(this);
// cut non-ui related stuff here ...
// Add widgets
for(int loop=0;loop<theAmountOfItemsWeAdd;++loop)
{
QLabel * ql=new QLabel("Caption");
QLineEdit * qle=new QLineEdit(this);
qle->setSizePolicy(QSizePolicy::Policy::Expanding,QSizePolicy::Policy::Fixed);
ui->formDisp->addRow(ql,qle); // ui->formDisp is of type QFormLayout*
}
// more non-UI related code
我正在创建一个qlineedit小部件,并将其添加到qformlayout," formDisp"。由于某些怪异的原因,我无法弄清楚,创建的Qlineedit没有任何帧,而SETFRAME不会启用它。
i此外,此处附加了.UI文件的相关部分:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DatasetWidget</class>
<widget class="QWidget" name="DatasetWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>723</width>
<height>591</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle">
<string>Datensatz</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="lblCaptionDatensatz">
<property name="text">
<string>Datensatz:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lblDatensatz">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
<underline>true</underline>
</font>
</property>
<property name="text">
<string>C-XXXX-XXX</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="leDescriptor">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string extracomment="ServiceTag"/>
</property>
<property name="maxLength">
<number>7</number>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="cmdDelete">
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="hawams.qrc">
<normaloff>:/icons/res/trash-3x.png</normaloff>:/icons/res/trash- 3x.png</iconset>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QFormLayout" name="formDisp"/>
</item>
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
</layout>
</widget>
<connections/>
</ui>
正如qtcreator中添加的小部件完全看起来应该看起来一样,我想关于我的代码一定是错误的。
更新:解决问题:周围的Qwidget正在QlistView中使用,它替换了一个较旧的固定尺寸版本的小部件。在填充QlistView的代码中,有一个硬编码的大小提示,该提示迫使QT调整了Qwidget的新(较大)版本的大小,并垂直"挤压"。结论:当您将Qwidget衍生物嵌入大小的Qwidget衍生物中,以使其不再足够的空间显示Qwidget布局中的所有项目时,事情会变得凌乱。
setFrame(true)
是一个无操作
a,我无法复制 - 以下两个线的编辑看起来相同,除了它们的尺寸,并且其最小尺寸设置为不同的值,第二个尺寸比第一个值大。QFormLayout
不执行固定的排高度!
// https://github.com/KubaO/stackoverflown/tree/master/questions/lineedit-frame-37831979
#include <QtWidgets>
#include <QtUiTools>
const char ui[] = R"EOF(
<ui version="4.0">
<class>DatasetWidget</class>
<widget class="QWidget" name="DatasetWidget">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="lblCaptionDatensatz">
<property name="text">
<string>Datensatz:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lblDatensatz">
<property name="text">
<string>C-XXXX-XXX</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="leDescriptor">
<property name="maxLength">
<number>7</number>
</property>
</widget>
</item>
<item>
<layout class="QFormLayout" name="formDisp"></layout>
</item>
</layout>
</widget>
<connections/>
</ui>)EOF";
int main(int argc, char ** argv) {
QApplication app{argc, argv};
QBuffer buf;
buf.setData(ui, sizeof(ui));
auto w = QUiLoader().load(&buf);
auto & layout = *w->findChild<QFormLayout*>("formDisp");
QLineEdit edit1, edit2;
layout.addRow("Edit1", &edit1);
layout.addRow("Edit2", &edit2);
edit1.setMinimumHeight(50);
edit2.setMinimumHeight(100);
w->show();
return app.exec();
}
解决了问题。添加到Qformlayout的第一个小部件是Qlabel。然后将行高设置为标签的高度。所有以下小部件都塞入"太狭窄"的行中,如果QT试图在它们周围绘制框架,则文本行不再适合它们 - 因此没有框架。解决方案:例如 setMinimumHeight(32)
上的第一个元素添加到qformlayout。
还有第二个错误。整个Qwidget是数据集的图形表示,在主要应用程序中,该小部件的许多实例都在qlistView中使用,以显示数据库查询的结果。在使用动态创建的Qwidget之前,我已经使用了一个固定尺寸的静态田地。这种尺寸被用作填充QListView的代码中的sizeHint,我完全忘记了这一点。在应用程序主窗口的代码中删除了错误的sizeHint之后,也不再需要setMinimumHeight(someInt)
。