找回密码
 立即注册
收起左侧

QDialog做登录界面的layout问题

4
回复
8534
查看
[复制链接]
累计签到:27 天
连续签到:1 天
来源: 2017-12-11 20:55:56 显示全部楼层 |阅读模式
1Qter豆
先声明一下,本人新人一个,非计算机行业,算是跨行爱好,所以编程不在行,纯属个人喜好,想学学QT,免得被笑后面的问题无知……
问题是:我看了论坛的QT快速入门教程第三章,用纯代码写界面,之前又看过一些豆子的教程,就顺便写了Layout布局,然后我就蒙了,我记得要来个setCentalWidget(mainLayout)的嘛,然后报错,想起好像这是QDialog不是QWidget……
没办法我就删了,直接运行,就出来了我要的登录界面,我愣了。
那么我的疑问来了,我写了这么多Layout,QT怎么知道我只要显示mainLayout?layout1/2/3/4都自动隐藏了?
新人求解,还望指教,谢谢!
  1. #include "logindlg.h"
  2. #include <QHBoxLayout>
  3. #include <QVBoxLayout>

  4. LoginDLG::LoginDLG(QWidget *parent):QDialog(parent)
  5. {
  6.     usrLabel = new QLabel(tr("UserName"));
  7.     pwdLabel = new QLabel(tr("Password"));

  8.     usrLineEdit = new QLineEdit();
  9.     usrLineEdit->setPlaceholderText(tr("Username"));
  10.     pwdLineEdit = new QLineEdit();
  11.     pwdLineEdit->setPlaceholderText(tr("Password"));

  12.     loginBtn = new QPushButton(tr("Login"));
  13.     exitBtn = new QPushButton(tr("Exit"));

  14.     //set the label layout
  15.     QVBoxLayout *layout1 = new QVBoxLayout();
  16.     layout1->addWidget(usrLabel);
  17.     layout1->addWidget(pwdLabel);

  18.     //set the lineEdit layout
  19.     QVBoxLayout *layout2 = new QVBoxLayout();
  20.     layout2->addWidget(usrLineEdit);
  21.     layout2->addWidget(pwdLineEdit);

  22.     //set the Label and LineEdit together
  23.     QHBoxLayout *layout3 = new QHBoxLayout();
  24.     layout3->addLayout(layout1);
  25.     layout3->addLayout(layout2);

  26.     //set the button layout
  27.     QHBoxLayout *layout4 = new QHBoxLayout();
  28.     layout4->addStretch();
  29.     layout4->addWidget(loginBtn);
  30.     layout4->addStretch();
  31.     layout4->addWidget(exitBtn);
  32.     layout4->addStretch();

  33.     //Set Main layout
  34.     QVBoxLayout *mainLayout = new QVBoxLayout(this);
  35.     mainLayout->addLayout(layout3);
  36.     mainLayout->addLayout(layout4);

  37.     connect(loginBtn, &QPushButton::clicked, this, &LoginDLG::accept);
  38.     connect(exitBtn, &QPushButton::clicked, this, &LoginDLG::close);
  39. }


  40. LoginDLG::~LoginDLG()
  41. {

  42. }
复制代码


最佳答案

查看完整内容

应该是这句把mainLayout设为了这个dialog顶级layout 参见QLayoutayout(QWidget *parent)
回复

使用道具 举报

累计签到:436 天
连续签到:1 天
2017-12-11 20:55:57 显示全部楼层
本帖最后由 miroox 于 2017-12-12 19:22 编辑
  1. QVBoxLayout *mainLayout = new QVBoxLayout(this);
复制代码

应该是这句把mainLayout设为了这个dialog顶级layout

参见QLayout::QLayout(QWidget *parent)
回复

使用道具 举报

累计签到:1 天
连续签到:1 天
2017-12-12 09:12:05 显示全部楼层
Qt并不是帮你隐藏了layout1,2,3,4,而是将他们整体布局呈现给你而已。还有你的程序有些臃肿,其实你只需要三个水平布局和一个垂直布局就可以,在垂直布局完了后记得setLayout(mainLayout);
回复

使用道具 举报

累计签到:27 天
连续签到:1 天
2017-12-13 12:04:16 显示全部楼层
本帖最后由 honcun 于 2017-12-13 12:09 编辑
topmanly 发表于 2017-12-12 09:12
Qt并不是帮你隐藏了layout1,2,3,4,而是将他们整体布局呈现给你而已。还有你的程序有些臃肿,其实你只需要 ...

谢谢指正和提供的解答!
用QFormLayout重新写了布局,清爽了很多!
回复

使用道具 举报

累计签到:27 天
连续签到:1 天
2017-12-13 12:08:41 显示全部楼层
miroox 发表于 2017-12-12 19:20
应该是这句把mainLayout设为了这个dialog顶级layout

参见QLayoutayout(QWidget *parent) ...

嗯我昨天看到1楼的回复
在垂直布局完了后记得setLayout(mainLayout)
后好好看了下自己的代码,发现了你说的这个this,作用setLayout(mainLayout)竟然是一样,我删掉这两句界面就是空白的了。发现自己果然是学得好浅。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了