• 7404阅读
  • 10回复

[提问]在构造函数里获取某个控件的信息是错误的 [复制链接]

上一主题 下一主题
离线liuxu_lx7
 
只看楼主 倒序阅读 楼主  发表于: 2011-05-04
有些时候,在构造函数里获取某个控件的信息是错误的。
例如:创建了一个QScrollArea, 通过QScrollArea::verticalScrollBar获取到QScrollBar。求QScrollBar的Size大小。
原本QScrollBar的宽度应该20左右,结果在构造函数里求得的结果却是:宽100,高30。

请问:在什么时刻开始,获取QScrollBar的Size才是正确的?(重载resize后,调试跟踪,发现运行时用此方法获取Size数值是正确的)

^_^
离线wxj120bw

只看该作者 1楼 发表于: 2011-05-05
引用楼主liuxu_lx7于2011-05-04 21:33发表的 在构造函数里获取某个控件的信息是错误的 :
有些时候,在构造函数里获取某个控件的信息是错误的。
例如:创建了一个QScrollArea, 通过QScrollArea::verticalScrollBar获取到QScrollBar。求QScrollBar的Size大小。
原本QScrollBar的宽度应该20左右,结果在构造函数里求得的结果却是:宽100,高30。
请问:在什么时刻开始,获取QScrollBar的Size才是正确的?(重载resize后,调试跟踪,发现运行时用此方法获取Size数值是正确的)
.......

给个建议 在构造函数里调用QTimer::singleShot()函数触发一个槽函数,在这个槽函数来得到那个大小。
离线liuxu_lx7
只看该作者 2楼 发表于: 2011-05-05
回 1楼(wxj120bw) 的帖子
感谢您的经验之谈 ^_^
离线XChinux

只看该作者 3楼 发表于: 2011-05-05
构造函数里的部件的size是默认值,所以此时获取到的size和运行时的可能不一样的,在构造函数中调用一个QTimer::singleShot()来调用自己的初始化方法后,此时界面可能已经显示出来了,此时才可能获得到想要的size值。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线liuxu_lx7
只看该作者 4楼 发表于: 2011-05-05
先创建控件,  同时设置QTimer::singleShot(),在slot中调用resize。无论singleShot给多少时间,都导致控件不显示了。
但,如果主动调一次resize,再配合调用1次QTimer::singleShot,就会正确显示,这时时间给多少都能显示。

谁能帮我解释下,resize到底是在什么事件之后设置成功? 提供资料也好,谢谢啦~~
离线dbzhang800

只看该作者 5楼 发表于: 2011-05-06
引用第4楼liuxu_lx7于2011-05-05 23:26发表的  :
先创建控件,  同时设置QTimer::singleShot(),在slot中调用resize。无论singleShot给多少时间,都导致控件不显示了。
但,如果主动调一次resize,再配合调用1次QTimer::singleShot,就会正确显示,这时时间给多少都能显示。
谁能帮我解释下,resize到底是在什么事件之后设置成功? 提供资料也好,谢谢啦~~

没看懂,你可以配合代码来描述你的问题
离线liuxu_lx7
只看该作者 6楼 发表于: 2011-05-06
回 5楼(dbzhang800) 的帖子
代码:
resizeWidget(); 包含一堆控件的resize。

只有连续执行下面2行代码,才能让resize生效,缺一不可。
QTimer::singleShot(1, this, SLOT(resizeWidget()));
resizeWidget();

很可能上面两行代码只是碰巧有了正确结果。

归根结底:我觉得我还是不清楚 resize 的运行机制。
所以现在想请教——resize 的运行机制

离线dbzhang800

只看该作者 7楼 发表于: 2011-05-06
Re:回 5楼(dbzhang800) 的帖子
引用第6楼liuxu_lx7于2011-05-06 10:56发表的 回 5楼(dbzhang800) 的帖子 :
代码:
resizeWidget(); 包含一堆控件的resize。
只有连续执行下面2行代码,才能让resize生效,缺一不可。
QTimer::singleShot(1, this, SLOT(resizeWidget()));
resizeWidget();

这两个连续用?那么QTimer那一行你完全可以去掉了。

题外:你没看懂前面两位让你用QTimer的singleShot来做什么
离线liuxu_lx7
只看该作者 8楼 发表于: 2011-05-06
回 7楼(dbzhang800) 的帖子
我理解的 #1 #3 的意思是:用QTimer在某一时刻触发slot, 在slot中再获取size值。这时size才是正确的。
因此,我写QTimer::singleShot(1, this, SLOT(resizeWidget())); 尝试了好几个级别的时间间隔,size是正确了,但是控件却不显示了。

唯有:
QTimer::singleShot(1, this, SLOT(resizeWidget()));
resizeWidget();
才可以正常显示控件。

附:我知道这里的写法是某种“碰巧”的行为(至少是我未知的),所以想了解这里隐含了哪些事实

感谢^_^
离线dbzhang800

只看该作者 9楼 发表于: 2011-05-06
Re:回 7楼(dbzhang800) 的帖子
引用第8楼liuxu_lx7于2011-05-06 14:17发表的 回 7楼(dbzhang800) 的帖子 :
我理解的 #1 #3 的意思是:用QTimer在某一时刻触发slot, 在slot中再获取size值。这时size才是正确的。
因此,我写QTimer::singleShot(1, this, SLOT(resizeWidget())); 尝试了好几个级别的时间间隔,size是正确了,但是控件却不显示了。
唯有:
QTimer::singleShot(1, this, SLOT(resizeWidget()));
.......

不妨贴出来你完整的测试程序吧(应该不会超过50行)
离线lx2597758
只看该作者 10楼 发表于: 2011-05-06
有收获
快速回复
限100 字节
 
上一个 下一个