即使明确要求这样做,在qformlayout中动态创建的Qwidget也没有框架

Dynamically created QWidget in QFormLayout does not have frame, even if explicitly asked to do so

本文关键字:创建 动态 Qwidget 框架 qformlayout 这样做      更新时间:2023-10-16

我对此代码有一个小问题:

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)