QHBoxLayout水平管理器如何用?

中才德创 2010-07-11 01:23:27
问题一:
想要实现的效果是:在客户区底部,从最左+3像素开始,排成一行,按钮间空隔3个像素,如何实现?
五个按钮左上角x座标依次是
3,
3+40+3,
3+40+3+40+3,
3+40+3+40+3+40+3,
3+40+3+40+3+40+3+40+3,
左上角y座标都是:客户区的高-40

以下的代码实现了自动排序,但效果是水平还是垂直,座标都无法满足要求。
#include <QtGui/QApplication>
#include <QWidget>
#include <QPushButton>
#include <QHBoxLayout>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

QWidget w;
w.setFixedSize(400, 250);

QPushButton btn1("btn1", &w);
QPushButton btn2("btn2", &w);
QPushButton btn3("btn3", &w);
QPushButton btn4("btn4", &w);
QPushButton btn5("btn5", &w);

btn1.setFixedSize(40, 40);
btn2.setFixedSize(40, 40);
btn3.setFixedSize(40, 40);
btn4.setFixedSize(40, 40);
btn5.setFixedSize(40, 40);

QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(&btn1);
layout->setSpacing(3);
layout->addWidget(&btn2);
layout->setSpacing(3);
layout->addWidget(&btn3);
layout->setSpacing(3);
layout->addWidget(&btn4);
layout->setSpacing(3);
layout->addWidget(&btn5);
w.setLayout(layout);

w.show();

return a.exec();
}
...全文
946 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
中才德创 2010-07-13
  • 打赏
  • 举报
回复
反复实验,现在OK了。代码如下:
#include <QtGui/QApplication>
#include <QWidget>
#include <QPushButton>
#include <QBoxLayout>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

QWidget w;

QPushButton btn1("btn1", &w);
QPushButton btn2("btn2", &w);
QPushButton btn3("btn3", &w);
QPushButton btn4("btn4", &w);
QPushButton btn5("btn5", &w);

btn1.setFixedSize(60, 60); //大
btn2.setFixedSize(40, 40); //小
btn3.setFixedSize(40, 40);
btn4.setFixedSize(40, 40);
btn5.setFixedSize(40, 40);

/*
首先把vLayout1 : vSpacer1 btn1看成纵一组
再把vLayout2 : vSpacer2 hLayout1(btn2btn3btn4btn5) vSpacer3看成纵一组(先把btn2btn3btn4btn5看成一横组)
最后把hLayout : vLayout1 vLayout2 hSpacer1看成横一组
*/
QHBoxLayout* hLayout = new QHBoxLayout();
QVBoxLayout* vLayout1 = new QVBoxLayout();
QHBoxLayout* hLayout1 = new QHBoxLayout();
QVBoxLayout* vLayout2 = new QVBoxLayout();
QSpacerItem* vSpacer1 = new QSpacerItem(20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding);
QSpacerItem* vSpacer2 = new QSpacerItem(20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding);
QSpacerItem* vSpacer3 = new QSpacerItem(20, 5, QSizePolicy::Minimum, QSizePolicy::Fixed);
QSpacerItem* hSpacer1 = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);

//vLayout1 : vSpacer1 btn1
vLayout1->addSpacerItem(vSpacer1);
vLayout1->addWidget(&btn1);

//hLayout1 : btn2btn3btn4btn5
hLayout1->addWidget(&btn2);
hLayout1->addWidget(&btn3);
hLayout1->addWidget(&btn4);
hLayout1->addWidget(&btn5);

//vLayout2 : vSpacer2 hLayout1(btn2btn3btn4btn5) vSpacer3
vLayout2->addSpacerItem(vSpacer2);
vLayout2->addLayout(hLayout1);
vLayout2->addSpacerItem(vSpacer3);

//hLayout : vLayout1 vLayout2 hSpacer1
hLayout->setSpacing(3);
hLayout->addLayout(vLayout1);
hLayout->addLayout(vLayout2);
hLayout->addSpacerItem(hSpacer1);

hLayout->setContentsMargins(0, 0, 0, 0);

w.setLayout(hLayout);

//w.setLayoutDirection(Qt::RightToLeft);

w.show();

return a.exec();
}

lefttime 2010-07-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hawkofwinter 的回复:]

效果OK。但实际上,我的第一个钮大,其它小。
btn1(60,60),其它(40,40)。现在的效果是btn2的y座标相对btn1偏了(60-40)/2=10。
相当于对中。但我不想对中,想让它偏移座标是14,如何做出此效果?

C/C++ code
#include <QtGui/QApplication>
#include <QWidget>
#include <QPushButt……
[/Quote]
这样的话, btn1和其它btn应该放在不同的layout中进行布局即可, 无论如何, 至少得加三个弹簧。
提供一种方法供参考: 垂直方向上弹簧A对btn1进行压缩, 弹簧B对剩下的几个Btn进行压缩即可;
中才德创 2010-07-11
  • 打赏
  • 举报
回复
效果OK。但实际上,我的第一个钮大,其它小。
btn1(60,60),其它(40,40)。现在的效果是btn2的y座标相对btn1偏了(60-40)/2=10
相当于对中。但我不想对中,想让它偏移座标是14,如何做出此效果?

#include <QtGui/QApplication>
#include <QWidget>
#include <QPushButton>
#include <QHBoxLayout>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

QWidget w;

QPushButton btn1("btn1", &w);
QPushButton btn2("btn2", &w);
QPushButton btn3("btn3", &w);
QPushButton btn4("btn4", &w);
QPushButton btn5("btn5", &w);

btn1.setFixedSize(60, 60); //大
btn2.setFixedSize(40, 40); //小
btn3.setFixedSize(40, 40);
btn4.setFixedSize(40, 40);
btn5.setFixedSize(40, 40);

//Grid
QGridLayout* gridLayout = new QGridLayout(&w);

//纵Space
QSpacerItem* verticalSpacer = new QSpacerItem(20, 20, QSizePolicy::Minimum, QSizePolicy::Expanding);

//横Space
QSpacerItem* horizontalSpacer = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);

//水平Box
QHBoxLayout* horizontalLayout = new QHBoxLayout();
horizontalLayout->setSpacing(3); //控件间间隔
horizontalLayout->addWidget(&btn1);
horizontalLayout->addWidget(&btn2);
horizontalLayout->addWidget(&btn3);
horizontalLayout->addWidget(&btn4);
horizontalLayout->addWidget(&btn5);

//布局
gridLayout->setContentsMargins(0, -1, -1, 0);
gridLayout->addItem(verticalSpacer, 0, 0, 1, 1);
gridLayout->addItem(horizontalSpacer, 1, 1, 1, 1);
gridLayout->addItem(horizontalLayout, 1, 0, 1, 1);

w.show();

return a.exec();
}
wnk007 2010-07-11
  • 打赏
  • 举报
回复
这个反复的实验,应该可以弄出结果。
lefttime 2010-07-11
  • 打赏
  • 举报
回复
你那个layout设置有问题; 另外再加两个弹簧就好了:

......
QWidget w;
w.setFixedSize(400, 250);

QGridLayout* gridLayout = new QGridLayout(&w);
gridLayout->setHorizontalSpacing(3);
gridLayout->setContentsMargins(0, -1, -1, 0);

QSpacerItem* verticalSpacer = new QSpacerItem(20, 200, QSizePolicy::Minimum, QSizePolicy::Expanding);
gridLayout->addItem(verticalSpacer, 0, 0, 1, 1);

QHBoxLayout* horizontalLayout = new QHBoxLayout();
horizontalLayout->setSpacing(3); // 控件间间隔
gridLayout->addItem(horizontalLayout, 1, 0, 1, 1);

QPushButton btn1("btn1", &w);
QPushButton btn2("btn2", &w);
QPushButton btn3("btn3", &w);
QPushButton btn4("btn4", &w);
QPushButton btn5("btn5", &w);

btn1.setFixedSize(40, 40);
btn2.setFixedSize(40, 40);
btn3.setFixedSize(40, 40);
btn4.setFixedSize(40, 40);
btn5.setFixedSize(40, 40);

horizontalLayout->addWidget(&btn1);
horizontalLayout->addWidget(&btn2);
horizontalLayout->addWidget(&btn3);
horizontalLayout->addWidget(&btn4);
horizontalLayout->addWidget(&btn5);

QSpacerItem* horizontalSpacer = new QSpacerItem(100, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
gridLayout->addItem(horizontalSpacer, 1, 1, 1, 1);

w.show();
......

16,212

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧