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

怎样在已布局的界面中获取子部件的尺寸

3
回复
5432
查看
[复制链接]
累计签到:56 天
连续签到:1 天
来源: 2015-9-19 14:50:27 显示全部楼层 |阅读模式

马上注册,查看详细内容!注册请先查看:注册须知

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
大家好,我在qtDesigner对我的界面布局后,而我想在通过resizeEvent()来获取布局后,某个gridlayout 子部件的geometry,但是经过调拭,发现获得的结果始终是默认的那个QRect(0,0 100*30)
经过我个人的研究和咨询发现只能在showEvent()之后才能获取正确的geometry,且showEvent()必须在立即显示界面的情况下才会被调用,
我在网上找到一种方法,通过代码来进行界面布局可以解决此问题,但由于我的界面已经写好,所以想问下怎样才能在不修改.ui的情况下获取该子部件的geometry()?

回复

使用道具 举报

累计签到:615 天
连续签到:1 天
2015-9-19 17:41:39 显示全部楼层
你的获取不正常吗?我这边很好啊,在resizeEvent(QResizeEvent *e)方法写了
qDebug()<<this->geometry();
qDebug()<<"woshibtn:"<<ui->pushButton->geometry();
然后获得了布局的参数,没有问题啊,你把你的代码贴出来看看吧
回复 支持 反对

使用道具 举报

累计签到:56 天
连续签到:1 天
2015-9-20 16:26:10 显示全部楼层
@qq1043068972 请问下你有进行布局了吗?如果我没有布局,我当然可以获得geometry(),但是我进行布局后,布局里的子部件就无法获得结果
  1. //当前屏幕大小
  2.     int app_width = this->width();
  3.     int app_height = this->height();

  4.     int h_spacer_width = app_width*40/800;
  5.     int v_spacer_height = app_height*5/600;

  6.     qDebug()<<app_width<<",,"<<app_height<<",,"<<h_spacer_width
  7.            <<",,"<<v_spacer_height;

  8.     /*
  9.      * 设置各部件自适应大小,默认屏幕大小800*600
  10.      *
  11.      */

  12.     //系统时间大小
  13.     int systemTime_height = app_height*20/600;
  14.     ui->systemframe->setMaximumHeight(systemTime_height);

  15.     //标题栏大小
  16.     int title_height = app_height*40/600;
  17.     ui->titleframe->setMaximumHeight(title_height);

  18.     ui->titleLayout->setContentsMargins(h_spacer_width,v_spacer_height,h_spacer_width,v_spacer_height);


  19.     //动画栏大小
  20.     int animate_height = app_height*20/600;
  21.     ui->animateframe->setMaximumHeight(animate_height);


  22.     //公告栏大小
  23.     int notice_height = app_height*180/600;
  24.     ui->noticeframe->setMaximumHeight(notice_height);
  25.     ui->noticeLayout->setContentsMargins(h_spacer_width,v_spacer_height,h_spacer_width,v_spacer_height);

  26.     //主界面大小
  27.     QRect camera_rect = ui->cameraframe->geometry();
  28.     QRect mes_rect =ui->mesframe->geometry();

  29.     qDebug()<<"before:"<<camera_rect<<","<<mes_rect;


  30.     //为防止拉得过长导致比例失调,如果数学原理,长宽增长值的比例值应该等于
  31.     //4:3,如果大于,就取小的
  32.     if((app_width-800)*3>=4*(app_height-600)
  33.        )
  34.     {
  35.         //设置实际长度
  36.         int actual = app_height*300/600;
  37.         qDebug()<<"actual:"<<actual;
  38.         camera_rect.setWidth(actual*4/3);
  39.         camera_rect.setHeight(actual);
  40.     }else{

  41.         int actual = app_width*400/800;
  42.         qDebug()<<"actual:"<<actual;
  43.         camera_rect.setWidth(actual);
  44.         camera_rect.setHeight(actual*3/4);
  45.     }

  46.     //为防止拉得过长导致比例失调,如果数学原理,长宽增长值的比例值应该等于
  47.     //45:56,如果大于,就取小的
  48.     if((app_width-800)*56>=45*(app_height-600))
  49.     {
  50.         int actual = app_height*323/600;
  51.         mes_rect.setWidth(actual*45/56);
  52.         mes_rect.setHeight(actual);
  53.     }else{
  54.         int actual = app_width*260/800;
  55.         mes_rect.setWidth(actual);
  56.         mes_rect.setHeight(actual*56/45);
  57.     }

  58.     ui->cameraframe->setGeometry(camera_rect);
  59.     ui->mesframe->setGeometry(mes_rect);

  60.     qDebug()<<"after:"<<camera_rect<<","<<mes_rect;

  61.     qDebug()<<ui->gridLayout_5->itemAt(3)->geometry();

  62.     QMainWindow::resizeEvent(e);
复制代码

点评

有啊,我进行了水平布局对两个button,让他们能自适应大小,,然后才去获得的  详情 回复 发表于 2015-9-21 08:26
回复 支持 反对

使用道具 举报

累计签到:615 天
连续签到:1 天
2015-9-21 08:26:13 显示全部楼层
侠隐 发表于 2015-9-20 16:26
@qq1043068972 请问下你有进行布局了吗?如果我没有布局,我当然可以获得geometry(),但是我进行布局后,布 ...

有啊,我进行了水平布局对两个button,让他们能自适应大小,,然后才去获得的
回复 支持 反对

使用道具 举报

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

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