QPushButton меняет размер виджетов в макете

1

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

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

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

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

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

Изображение 174551

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

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

Изображение 174551

Вот код, который я использую для динамического добавления 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, так и для макета, похоже, не имеет никакого эффекта. Есть ли кто-нибудь, кто мог бы пролить свет на эту проблему?

  • 0
    отредактировал мой ответ, надеюсь что поможет
Теги:
qt
qt5

1 ответ

2
Лучший ответ

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

Изображение 174551

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

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

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

Чтобы изменить минимальную высоту, нужно изменить политику размеров QWidget, установив параметр Максимум в вертикальной политике:

Изображение 174551

И в этом втором макете добавить кнопку. .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);
}

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

Изображение 174551

Изображение 174551

  • 0
    Спасибо за помощь, с небольшой настройкой, которая, кажется, работает. У вас есть идеи, почему это так? Кажется немного нелогичным, что вам нужно обернуть кнопку в другом виджете, чтобы макет работал правильно.
  • 1
    @LukeHutton Вы действительно можете удалить QWidget, но, поскольку ширина QPushButton меньше ширины QLabel, я хотел избежать сложностей и добавил его в qwidget, чтобы все кнопки работали так. В Qt QWidget может использоваться как контейнер для других виджетов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню