QPushButton更改布局中小部件的大小

时间:2019-02-19 21:31:32

标签: c++ qt qt5

这个问题使我发疯,我似乎找不到合理的答案。我对此很陌生,所以请忍受。

我一直在创建一个应用程序,在其中创建垂直的“导航栏”,并且需要动态添加QPushButton。我注意到 添加QPushButton时,标签在QVBox中的水平位置会更改。

我创建了一个最低版本:

在添加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 :(得分:2)

让我们借助Qt Designer分析您的.ui,如果我们拉伸窗口,则会得到以下信息:

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