• 6624阅读
  • 0回复

[原创][原创]有关设置 QDockWidget 初始大小 [复制链接]

上一主题 下一主题
离线liuxu_lx7
 
只看楼主 倒序阅读 楼主  发表于: 2012-09-06
修改:「时序」对初始化的影响,见最后。


第一组测试代码:

  1. int main(int argc, char *argv[])
  2. {
  3.     // ......省略创建QApplication & QMainWindow 过程
  4.     QDockWidget* pDockw = new CustomDockWidget;
  5.     mainWidow.addDockWidget(Qt::LeftDockWidgetArea, pDockw);  
  6.     // [A]
  7. }
  8. class CustomDockWidget : public QDockWidget  
  9. {  
  10. public:  
  11.     QSize sizeHint() const
  12.     {  
  13.         // 初始化窗口大小;  
  14.         return QSize(500, 900);            // [B]
  15.     }  
  16. };  


的位置分别改写一下内容,测试:
QSize(10, 900);        // [1]    QDockWidget.width = 73;
QSize(100, 900);        // [2]    QDockWidget.width = 100;
QSize(200, 900);        // [3]    QDockWidget.width = 200;

测试结果:
除[1]的数值太小,被设置成了width=73, 其它俩个测试符合测试结果,即:
准确显示QDockWidget在QMainWindow中的宽(“高”未试验)。
结论:在无widget的情况下, 使用sizeHint进行初始大小设置是有效的.

第二组测试代码:
“在以上代码的基础上增加”,代码如下:
  1. [b]class MyWidget : public QFrame   [/b]
  2. [b]{   [/b]
  3. [b]public:   [/b]
  4. [b]    QSize sizeHint() const  [/b]
  5. [b]    {   [/b]
  6. [b]        // 初始化窗口大小;   [/b]
  7. [b]        return QSize(500, 900);        // [C][/b]
  8. [b]    }   [/b]
  9. [b]};[/b]


main 函数内增加([A]位置):
  1. [b]{[/b]
  2. [b]    MyWidget* pw = new MyWidget;[/b]
  3. [b]    pDockw->setWidget(pw);[/b]
  4. [b]}[/b]



的位置改写为最小的值: QSize(10, 900);    
目的:减少QDockWidget设置对之后的影响。

[C]的位置分别改写一下内容,测试:
QSize(80, 900);        // [1]    QDockWidget.width = 80;
QSize(150, 900);        // [2]    QDockWidget.width = 150;
QSize(500, 900);        // [3]    QDockWidget.width = 500;

证实:在QDockWidget的宽度“极小”的情况下,
其内部Widget的大小,影响QDockWidget最终大小。


第三组测试:
以上测试过程不变, 这次将
的位置改写为很大值: QSize(600, 900);    
目的:测试QDockWidget的大小大于Widget大小时的结果.

结果:
QSize(80, 900);        // [1]    QDockWidget.width = 80;
QSize(150, 900);        // [2]    QDockWidget.width = 150;
QSize(500, 900);        // [3]    QDockWidget.width = 500;

间接说明: 在QDockWidget内部有widget,且widget有确切初始值时,
QDockWidget的初始值不再起最终作用.



第四组测试: 目标: 存储 & 恢复 QDockWidget几何信息;
注释掉之前有关"MyWidget"的代码,
即:只有 QApplication & QMainWindow & QDockWidget 3个.
使用 QSettings 做"存储 & 恢复".

有关QSettings的代码如下:
[定义:]QSettings settings("<随便1>", "<随便2>");
[恢复:]
  1. [b][b][b]const QString key("<起个唯一名字, 存取对应>");[/b][/b][/b]
  2. [b][b][b]const QByteArray ba(settings.value(key + QLatin1String("/geometry")).toByteArray());[/b][/b][/b]
  3. [b][b][b]restoreGeometry(ba);[/b][/b][/b]



[存储:]
  1. [b][b][b]settings.beginGroup("<起个唯一名字 存取对应>");[/b][/b][/b]
  2. [b][b][b]settings.setValue(QLatin1String("geometry"), saveGeometry());[/b][/b][/b]
  3. [b][b][b]settings.endGroup();[/b][/b][/b]



测试:
在~CustomDockWidget内调用[存储]. 在addDockWidget完后[恢复].

测试结果: 在取出normalGeometry时失败=>数据无效.
验证结果:
在~CustomDockWidget中,saveGeometry()之前,获取
  1. [b][b][b]QRect rect1 = frameGeometry();        // 有效[/b][/b][/b]
  2. [b][b][b]QRect rect2 = normalGeometry();    // 无效 (0,0,-1,-1)[/b][/b][/b]


注: 为以防在析构过程中normalGeometry被"脏", 改为在app.exec();执行完毕后;
最终结论:只有QDockWidget时,无法进行几何结构的有效存储.


第五组测试: 仅为MyWidget存储几何信息;
测试方式: 分别在MyWidget的构造和析构函数里写上[恢复]和[存储].
运行测试:  -_-!! 失败 :(
为什么没有恢复成功呢? 跟踪了[取出]时的 frameGeometry() 和 normalGeometry(),
数据正确. 只有怀疑"初始值"啦~~


第六组测试: 有有效恢复数据时,将"初始值"覆盖, 即: sizeHint返回[取出]的结果;
运行测试: (^o^)~~


补充:时序对初始化几何信息的影响。
划分3件事情:a:设置中心widget。b:添加toolwidget(dockwidget)。c:show MainWindow。
3个的时序不是完全随意的,当b=>c=>a时,设置失败(只有这种顺序失败)。


快速回复
限100 字节
 
上一个 下一个