刚学qt,请教各位大大一个布局问题

chenbaibin 2011-10-31 10:20:23
不废话,直接上代码
构造函数:
ui->setupUi(this);
resize(300,200);
this->setWindowTitle(tr("欢迎使用,请登录"));
usrname=new QLabel(this);
usrname->setText(tr("用户名"));
password=new QLabel(this);
password->setText(tr("密码"));
usrLineEdit=new QLineEdit(this);
passwordLineEdit=new QLineEdit(this);
QGridLayout *gridLayout=new QGridLayout(this);
gridLayout->addWidget(usrname,0,0,1,1);
gridLayout->addWidget(usrLineEdit,0,1,1,3);
gridLayout->addWidget(password,1,0,1,1);
gridLayout->addWidget(passwordLineEdit,1,1,1,3);
btn_ok=new QPushButton(this);
btn_ok->setText(tr("登录"));
btn_cancel=new QPushButton(this);
btn_cancel->setText(tr("退出"));
QHBoxLayout *hboxLayout=new QHBoxLayout(this);
hboxLayout->setSpacing(60);
hboxLayout->addWidget(btn_ok);
hboxLayout->addWidget(btn_cancel);
QVBoxLayout *vboxLayout=new QVBoxLayout(this);
vboxLayout->setMargin(40);
vboxLayout->addLayout(gridLayout);
vboxLayout->addStretch(40);
vboxLayout->addLayout(hboxLayout);
setLayout(vboxLayout);
定义在这里
QLabel *usrname;
QLabel *password;
QLineEdit *usrLineEdit;
QLineEdit *passwordLineEdit;
QPushButton *btn_ok;
QPushButton *btn_cancel;

使用以上代码生成的ui中button总是在左上角,而且只能显示一个,请问是什么问题。我以前是在linux下操作,现在刚转到woindow下,还想请问下windows和linux下的qt creator使用还有什么区别??
...全文
341 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
蟹子 2011-11-09
  • 打赏
  • 举报
回复
ui->setupUi(this);
resize(300,200);
this->setWindowTitle(tr("欢迎使用,请登录"));
usrname=new QLabel(this);
usrname->setText(tr("用户名"));
password=new QLabel(this);
password->setText(tr("密码"));
usrLineEdit=new QLineEdit(this);
passwordLineEdit=new QLineEdit(this);
qDebug()<<"gridlayout";
QGridLayout *gridLayout=new QGridLayout(this);
gridLayout->addWidget(usrname,0,0,1,1);
gridLayout->addWidget(usrLineEdit,0,1,1,3);
gridLayout->addWidget(password,1,0,1,1);
gridLayout->addWidget(passwordLineEdit,1,1,1,3);
btn_ok=new QPushButton(this);
btn_ok->setText(tr("登录"));
btn_cancel=new QPushButton(this);
btn_cancel->setText(tr("退出"));
qDebug()<<"hboxlayout";
QHBoxLayout *hboxLayout=new QHBoxLayout(this);
hboxLayout->setSpacing(60);
hboxLayout->addWidget(btn_ok);
hboxLayout->addWidget(btn_cancel);
qDebug()<<"vboxlayout";
QVBoxLayout *vboxLayout=new QVBoxLayout(this);
vboxLayout->setMargin(40);
qDebug()<<"add gridlayout";
vboxLayout->addLayout(gridLayout);
vboxLayout->addStretch(40);
qDebug()<<"add hboxlayout";
vboxLayout->addLayout(hboxLayout);
qDebug()<<"setlayout";
setLayout(vboxLayout);

提示信息:
gridlayout
hboxlayout
QLayout: Attempting to add QLayout "" to Widget "Widget", which already has a layout
vboxlayout
QLayout: Attempting to add QLayout "" to Widget "Widget", which already has a layout
add gridlayout
QLayout::addChildLayout: layout "" already has a parent
add hboxlayout
setlayout
QWidget::setLayout: Attempting to set QLayout "" on Widget "Widget", which already has a layout
很明显了吧,你初始化的三个layout都指定了this指针,起作用的其实只有第一次指定this指针那个layout也就是QGridLayout,其他的都没有起作用。可以在定义layout时不指定this指针,布局完成之后调用this->setLayout()指定主窗口布局。或者只在主窗口布局定义时指定this为其父辈指针,这个例子中就是QVBoxLayout
JedyChen 2011-11-09
  • 打赏
  • 举报
回复
Qt有一个版本4.x,bug中有一个:未布局时,窗口的widget对象位于左上角显示(颜色为背景色),窗口背景色改为其他颜色时,能看到这个widget。
tlmyj666888 2011-11-09
  • 打赏
  • 举报
回复
布局定义的顺序调整一下试试,把最外层的布局先定义,内部的布局后定义

QVBoxLayout *vboxLayout=new QVBoxLayout(this);
GridLayout *gridLayout=new QGridLayout(this);
QHBoxLayout *hboxLayout=new QHBoxLayout(this);

蓝夜孤星 2011-11-08
  • 打赏
  • 举报
回复
把所有布局的this指针去掉。布局本身不属于Widget。
kangjie666 2011-11-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lvyewuyou19 的回复:]

引用 1 楼 dbzhang800 的回复:
引用楼主 chenbaibin 的回复:
QGridLayout *gridLayout=new QGridLayout(this);
QHBoxLayout *hboxLayout=new QHBoxLayout(this);
QVBoxLayout *vboxLayout=new QVBoxLayout(this);
setLayout……
[/Quote]

设置总包含的为THIS,其它的统统去掉……
albert988 2011-11-07
  • 打赏
  • 举报
回复
修正,把mainLayout改成你的vboxLayout
albert988 2011-11-07
  • 打赏
  • 举报
回复
如果我没猜错的话,你的this是个QMainWindow吧
可以这样改

QWidget* mainWidget = new QWidget;
mainWidget->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum));
mainLayout->setMargin(0);
mainWidget->setLayout(mainLayout);
this->setCentralWidget(mainWidget);
lvyewuyou19 2011-11-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dbzhang800 的回复:]
引用楼主 chenbaibin 的回复:
QGridLayout *gridLayout=new QGridLayout(this);
QHBoxLayout *hboxLayout=new QHBoxLayout(this);
QVBoxLayout *vboxLayout=new QVBoxLayout(this);
setLayout(vboxLayout);

……
[/Quote]this只要一个就行了,将其他的布局放到主布局上就行了,还有只显示一个按钮应该是你没布局成功吧,,然后就造成后面的按钮将前面的布局给覆盖了吧····
在水一方 2011-11-04
  • 打赏
  • 举报
回复
改成下面两句试试
hboxLayout->addWidget(btn_ok,0,0);
hboxLayout->addWidget(btn_cancel,0,1);
dbzhang800 2011-11-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 chenbaibin 的回复:]

这个在windows下是正常的 ,后面的this不加是不行的,我知道在linux下可以不用加
[/Quote]
我都不知道这个结论都是如何得出来的。

QGridLayout *gridLayout=new QGridLayout(this);

等价于

QGridLayout *gridLayout=new QGridLayout;
this.setLayout(gridLayout);

而setLayout只能调用一次
chenbaibin 2011-11-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wquanchao 的回复:]
不管在那编程,页面的内容都需要定位,明显是这个问题
[/Quote]

我觉得不应该是这个问题,就算是没有定位,我加了布局管理后,也不应该是那个显示啊。
chenbaibin 2011-11-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dbzhang800 的回复:]
引用楼主 chenbaibin 的回复:
QGridLayout *gridLayout=new QGridLayout(this);
QHBoxLayout *hboxLayout=new QHBoxLayout(this);
QVBoxLayout *vboxLayout=new QVBoxLayout(this);
setLayout(vboxLayout);

……
[/Quote]

这个在windows下是正常的 ,后面的this不加是不行的,我知道在linux下可以不用加
wquanchao 2011-11-01
  • 打赏
  • 举报
回复
不管在那编程,页面的内容都需要定位,明显是这个问题
dbzhang800 2011-10-31
  • 打赏
  • 举报
回复
[Quote=引用楼主 chenbaibin 的回复:]
QGridLayout *gridLayout=new QGridLayout(this);
QHBoxLayout *hboxLayout=new QHBoxLayout(this);
QVBoxLayout *vboxLayout=new QVBoxLayout(this);
setLayout(vboxLayout);
[/Quote]
你确定这种东西在非Windows下正常?

题外:如果你看控制台输出的话,应该能看到很多提示信息才对。

16,175

社区成员

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

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