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

Posted

技术标签:

【中文标题】QPushButton 更改布局中小部件的大小【英文标题】:QPushButton changes size of widgets in layout 【发布时间】:2019-02-19 21:31:32 【问题描述】:

这个问题让我发疯了,我似乎找不到合乎逻辑的答案。我对此很陌生,所以请多多包涵。

我一直在创建一个应用程序,在该应用程序中创建了一个垂直的“导航栏”,并且需要动态添加 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】:

让我们在 Qt Designer 的帮助下分析您的 .ui,如果我们拉伸窗口,您会得到以下结果:

正如您所见,布局只影响 QLabel,因此布局不会处理初始按钮,但添加的按钮会。因此,您不会观察到类似的行为。

解决方案是使用以下结构重构设计:

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

您必须通过在 Vertical Policy 中设置 Maximum 来更改 QWidget 的大小策略以采用最小高度:

然后在第二个布局中添加按钮。 .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);

获得以下内容:

【讨论】:

感谢您的帮助,稍作调整似乎可行。你知道为什么会这样吗?您必须将按钮包装在另一个小部件中才能使布局正常工作,这似乎有点违反直觉。 @LukeHutton 您实际上可以删除 QWidget,但由于 QPushButton 的宽度小于 QLabel 的宽度,我想避免复杂化并将其添加到 qwidget 中,以便所有按钮的行为都像这样.在 Qt 中,QWidget 可以用作其他小部件的容器。

以上是关于QPushButton 更改布局中小部件的大小的主要内容,如果未能解决你的问题,请参考以下文章

更改按钮文本时如何自动更改 QPushButton 宽度和 QMenuBar 角小部件宽度?

如何在 androidx 抽屉布局小部件中更改字体大小和颜色

如何在堆栈中垂直或水平居中小部件?

更改 Qt 布局中的调整大小行为

布局中小部件的哪个样式表选择器?

QPushButton 的大小打破了布局高度(MacOS)