我对这段代码有个小问题:
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也没有启用它。
我还在这里附加了.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中添加的小部件看起来就像它们应该看起来的那样,我想我的代码中的一些东西一定是错误的。
更新:问题解决了:在QListView中使用的是环境QWidget,它替换了小部件的一个旧的、固定大小的版本。在用条目填充QListView的代码中,有一个硬编码的大小提示,迫使Qt调整新的(更大的) QWidget版本的大小,并垂直压缩它。结论:当您将一个QWidget派生程序嵌入到修改它的旧代码中,这样就没有足够的空间来显示QWidget布局中的所有项,事情就会变得一团糟。
发布于 2016-06-15 15:29:04
由于框架是默认设置的,所以setFrame(true)
是不操作的。
唉,我不能复制--下面的两行编辑看起来都是一样的,除了它们的大小,而且它们的最小大小被设置为不同的值,第二个比第一个大。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();
}
发布于 2016-06-15 16:52:41
问题解决了。添加到QFormLayout中的第一个Widget是一个QLabel。然后将行高设置为标签的高度。下面所有的小部件都被塞进了“太窄”的行中,如果Qt试图在它们周围画一个框架,那么文本行就不适合它们了--所以没有框架。解决方案:例如,添加到setMinimumHeight(32)
中的第一个元素的QFormLayout。
还有第二个错误。整个QWidget是dataset的图形表示,在主应用程序中,这个小部件的许多实例被用于在QListView中显示数据库查询的结果。在使用动态创建的QWidget之前,我使用了一个固定大小的静态小部件。这个大小在填充sizeHint的代码中被用作QListView,我完全忘记了这一点。在删除了应用程序主窗口代码中的错误sizeHint之后,也不再需要setMinimumHeight(someInt)
了。
https://stackoverflow.com/questions/37831979
复制相似问题