QPushButton меняет размер виджетов в макете - PullRequest
0 голосов
/ 20 февраля 2019

Эта проблема сводит меня с ума, и я не могу найти логического ответа.Я довольно новичок в этом, поэтому, пожалуйста, имейте в виду.

Я создаю приложение, в котором я создаю вертикальную «панель навигации» и мне нужно динамически добавлять QPushButtons.Я заметил, что горизонтальное положение метки в QVBox изменяется, когда к нему добавляется QPushButton.

Я создал минимальную версию:

Перед добавлением QPushButton:

Метка достигает края приложения

После добавления QPushButton:

Ширина метки немного уменьшается

Вот код, который я использую для динамического добавления файла QPushButton:

void MainWindow::on_pushButton_clicked()
{
    QPushButton *newButton = new QPushButton("Test");
    newButton->setContentsMargins(0,0,0,0);
    newButton->setStyleSheet("margin: 0; padding: 0;");
    ui->verticalLayout->setMargin(0);
    ui->verticalLayout->setContentsMargins(0,0,0,0);

    // add new push button inside VBox
    ui->verticalLayout->addWidget(newButton);
}

.ui:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>203</width>
    <height>224</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <widget class="QWidget" name="verticalLayoutWidget">
    <property name="geometry">
     <rect>
      <x>0</x>
      <y>0</y>
      <width>201</width>
      <height>151</height>
     </rect>
    </property>
    <layout class="QVBoxLayout" name="verticalLayout">
     <item>
      <widget class="QLabel" name="label">
       <property name="styleSheet">
        <string notr="true">border: 1px solid white;</string>
       </property>
       <property name="text">
        <string>TextLabel</string>
       </property>
      </widget>
     </item>
    </layout>
   </widget>
   <widget class="QPushButton" name="pushButton">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>180</y>
      <width>181</width>
      <height>32</height>
     </rect>
    </property>
    <property name="text">
     <string>Add Push Button To VBox</string>
    </property>
   </widget>
  </widget>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>

Как вы можете видеть, установив поля на обоихQPushButton и макет, кажется, не имеют никакого эффекта.Есть ли кто-нибудь, кто мог бы пролить свет на этот вопрос?

1 Ответ

0 голосов
/ 20 февраля 2019

Давайте проанализируем ваш .ui с помощью Qt Designer, если мы растянем окно, вы получите следующее:

enter image description here

Как вы можете видетьмакет влияет только на QLabel, поэтому начальная кнопка не будет обрабатываться макетом, но добавленная кнопка будет.Следовательно, вы не наблюдаете подобного поведения.

Решение состоит в том, чтобы реструктурировать дизайн, используя следующую структуру:

QMainWindow
└── QVBoxLayout
    ├── QLabel
    └── QWidget
        └── QVBoxLayout
            └── QPushButton

Необходимо изменить политику размеров QWidget, чтобы получить минимумвысоту, установив Максимум в вертикальной политике:

enter image description here

И во втором макете добавьте кнопку..Ui выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>335</width>
    <height>303</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <layout class="QVBoxLayout" name="verticalLayout_2">
    <item>
     <widget class="QLabel" name="label">
      <property name="styleSheet">
       <string notr="true">border: 1px solid white;</string>
      </property>
      <property name="text">
       <string>TextLabel</string>
      </property>
     </widget>
    </item>
    <item>
     <widget class="QWidget" name="widget" native="true">
      <property name="sizePolicy">
       <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
        <horstretch>0</horstretch>
        <verstretch>0</verstretch>
       </sizepolicy>
      </property>
      <layout class="QVBoxLayout" name="verticalLayout">
       <item>
        <widget class="QPushButton" name="pushButton">
         <property name="text">
          <string>Add Push Button To VBox</string>
         </property>
        </widget>
       </item>
      </layout>
     </widget>
    </item>
   </layout>
  </widget>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>

Тогда больше нет необходимости изменять кнопку:

void MainWindow::on_pushButton_clicked()
{
    QPushButton *newButton = new QPushButton("Test");
    ui->verticalLayout->addWidget(newButton);
}

Получение следующего:

enter image description here

enter image description here

...