QSplitter, похоже, переворачивает виджеты содержимого индекса - PullRequest
0 голосов
/ 04 ноября 2019

Кажется, что когда я помещаю 2 кадра в QSplitter, разделитель, кажется, дает обратный индекс кадров.

Например:

enter image description here

Я помещаю 2 кадра (frame_A и frame_B) в вертикальный разделитель. Сначала создается Frame_B, а затем Frame_A. Когда я НЕ использую QSplitter, сначала определяется Frame_A.

<QSplitter>
  <frame_B>
  <frame_A>
<QSplitter>

Как убедиться, что сначала создается верхний кадр, а не нижний?

ВещиЯ пытался

  • Изменение названий кадров (в алфавитном порядке). Не сработало
  • Снятие кадров и их повторное добавление в том порядке, который я хотел. Не сработало.
  • Удаление рамок и их повторное добавление в обратном порядке, который я хотел. Не сработало

Что-то, что сработало, поместило верхний список внизу и наоборот перед добавлением Splitter, и это действительно сработало, но это делает форму перевернутой.

Минимальный воспроизводимый пример

Файл Splitter.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Form</class>
 <widget class="QWidget" name="Form">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <widget class="QSplitter" name="splitter">
   <property name="geometry">
    <rect>
     <x>45</x>
     <y>40</y>
     <width>261</width>
     <height>166</height>
    </rect>
   </property>
   <property name="orientation">
    <enum>Qt::Vertical</enum>
   </property>
   <widget class="QFrame" name="frame_A">
    <property name="frameShape">
     <enum>QFrame::StyledPanel</enum>
    </property>
    <property name="frameShadow">
     <enum>QFrame::Raised</enum>
    </property>
   </widget>
   <widget class="QFrame" name="frame_B">
    <property name="frameShape">
     <enum>QFrame::StyledPanel</enum>
    </property>
    <property name="frameShadow">
     <enum>QFrame::Raised</enum>
    </property>
   </widget>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

Чтобы найти заказ, я использую следующий код

static void dumpWidgetRecursion(QTextStream &str, const QWidget *w, int depth = 0)
{
    if (depth)
        str << QString(depth * 2, QLatin1Char(' '));
    const QRect geom = w->geometry();
    str << '"' << w->metaObject()->className() << "\"/\"" << w->objectName() << "\" "
        << geom
        << (w->isVisible() ? "[visible] " : "[hidden] ");
    if (w->testAttribute(Qt::WA_Mapped))
        str << "[mapped] ";
    str << '\n';
    foreach (QObject *c, w->children()) {
        if (c->isWidgetType())
             dumpWidgetRecursion(str, (const QWidget *)(c), depth + 1);
    }
}

static void dumpAllWidgets()
{
    QString d;
    QTextStream str(&d);
    std::ofstream myfile("dumpallwidgets.txt");

    str << "### QWidgets:\n";
    foreach (const QWidget *w, QApplication::topLevelWidgets())
         dumpWidgetRecursion(str, w);
    myfile << d.toStdString();
}

Это даст мнерезультат:

"QSplitter"/"splitter" 571x241+140+70[visible] 
          "QFrame"/"frame_B" 571x118+0+123[visible] 
          "QFrame"/"frame_A" 571x118+0+0[visible] 
          "QSplitterHandle"/"qt_splithandle_" 100x30+0+0[hidden] 
          "QSplitterHandle"/"qt_splithandle_" 571x5+0+118[visible]

Как видите, Frame_B предшествует Frame_A, что не является ожидаемым результатом.

...