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 角小部件宽度?