首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在QWidget中动态创建的QFormLayout没有框架,即使被显式要求也没有。

在QWidget中动态创建的QFormLayout没有框架,即使被显式要求也没有。
EN

Stack Overflow用户
提问于 2016-06-15 09:53:05
回答 2查看 1.2K关注 0票数 0

我对这段代码有个小问题:

代码语言:javascript
运行
复制
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文件的相关部分:

代码语言:javascript
运行
复制
<?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布局中的所有项,事情就会变得一团糟。

EN

回答 2

Stack Overflow用户

发布于 2016-06-15 15:29:04

由于框架是默认设置的,所以setFrame(true)是不操作的。

唉,我不能复制--下面的两行编辑看起来都是一样的,除了它们的大小,而且它们的最小大小被设置为不同的值,第二个比第一个大。QFormLayout不强制使用固定行高度!

代码语言:javascript
运行
复制
// 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();
}
票数 0
EN

Stack Overflow用户

发布于 2016-06-15 16:52:41

问题解决了。添加到QFormLayout中的第一个Widget是一个QLabel。然后将行高设置为标签的高度。下面所有的小部件都被塞进了“太窄”的行中,如果Qt试图在它们周围画一个框架,那么文本行就不适合它们了--所以没有框架。解决方案:例如,添加到setMinimumHeight(32)中的第一个元素的QFormLayout。

还有第二个错误。整个QWidget是dataset的图形表示,在主应用程序中,这个小部件的许多实例被用于在QListView中显示数据库查询的结果。在使用动态创建的QWidget之前,我使用了一个固定大小的静态小部件。这个大小在填充sizeHint的代码中被用作QListView,我完全忘记了这一点。在删除了应用程序主窗口代码中的错误sizeHint之后,也不再需要setMinimumHeight(someInt)了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37831979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档