8.布局管理器

Posted lyndonmario

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8.布局管理器相关的知识,希望对你有一定的参考价值。

1.新组件:
①QSpinBox
 只能输入数字的输入框,并且带有上下箭头的步进按钮

②QSlider
 带有滑块的滑杆

③这两个组件的连接
 QObject::connect(slider, &QSlider::valueChanged, spinBox, &QSpinBox::setValue);
1
 
1
 QObject::connect(slider, &QSlider::valueChanged, spinBox, &QSpinBox::setValue);
  很容易就能看明白这个连接的过程

但是如果这么写从spinBox到slider的过程就会报错
QObject::connect(spinBox, &QSpinBox::valueChanged, slider, &QSlider::setValue);
no matching function for call to ‘QObject::connect(QSpinBox*&, <unresolved overloaded function type>, QSlider*&, void (QAbstractSlider::*)(int))‘
2
1
QObject::connect(spinBox, &QSpinBox::valueChanged, slider, &QSlider::setValue);
2
no matching function for call to ‘QObject::connect(QSpinBox*&, <unresolved overloaded function type>, QSlider*&, void (QAbstractSlider::*)(int))‘

为何会出现这个错误,我们来仔细看看&QSpinBox::valueChanged这个函数

QSpinBox的文档发现,QSpinBox的确有两个信号:

  • void valueChanged(int)
  • void valueChanged(const QString &)

那么在调用这个函数的时候就会因为二义性而报错了。
解决方法也很简单,在调用之前显示的指定一个函数。方法就是,我们创建一个函数指针,这个函数指针参数指定为 int:

void (QSpinBox:: *spinBoxSignal)(int) = &QSpinBox::valueChanged;
然后我们将这个函数指针作为 signal,与 QSlider 的函数连接:
QObject::connect(spinBox, spinBoxSignal, slider, &QSlider::setValue);
1
1
void (QSpinBox:: *spinBoxSignal)(int) = &QSpinBox::valueChanged;
2
然后我们将这个函数指针作为 signal,与 QSlider 的函数连接:
3
QObject::connect(spinBox, spinBoxSignal, slider, &QSlider::setValue);



2.下面的代码,我们创建了一个QHBoxLayout对象。显然,这就是一个布局管理器。然后将这两个组件都添加到这个布局管理器,并且把该布局管理器设置为窗口的布局管理器。这些代码看起来都是顺理成章的,应该很容易明白。并且,布局管理器很聪明地做出了正确的行为:保持QSpinBox宽度不变,自动拉伸QSlider的宽度。


Qt 提供了几种布局管理器供我们选择:

  • QHBoxLayout:按照水平方向从左到右布局;
  • QVBoxLayout:按照竖直方向从上到下布局;
  • QGridLayout:在一个网格中进行布局,类似于 html 的 table;
  • QFormLayout:按照表格布局,每一行前面是一段文本,文本后面跟随一个组件(通常是输入框),类似 HTML 的 form;
  • QStackedLayout:层叠的布局,允许我们将几个组件按照 Z 轴方向堆叠,可以形成向导那种一页一页的效果。














以上是关于8.布局管理器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Android片段管理器传递变量[重复]

方向更改时不可见的片段

在片段着色器中输出数据时切换布局位置

massCode 一款优秀的开源代码片段管理器

Android:使用支持片段管理器时复制片段

常用布局管理器