修改:「時序」對初始化的影響,見最后。第一組測驗代碼: 復制代碼int main(int argc, char *argv[]){ // ......省略創建QApplication & QMainWindow 程序 QDockWidget* pDockw = new CustomDockWidget; mainWidow.addDockWidget(Qt::LeftDockWidgetArea, pDockw); // [A]}class CustomDockWidget : public QDockWidget { public: QSize sizeHint() const { // 初始化視窗大小; return QSize(500, 900); // } }; 在的位置分別改寫一下內容,測驗: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進行初始大小設定是有效的. 第二組測驗代碼:“在以上代碼的基礎上增加”,代碼如下:復制代碼[b]class MyWidget : public QFrame { public: QSize sizeHint() const { // 初始化視窗大小; return QSize(500, 900); // [C] } }; main 函式內增加([A]位置):復制代碼{ MyWidget* pw = new MyWidget; pDockw->setWidget(pw);} 在的位置改寫為最小的值: 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>");[恢復:]復制代碼[b][b]const QString key("<起個唯一名字, 存取對應>");[/b][/b][b][b]const QByteArray ba(settings.value(key + QLatin1String("/geometry")).toByteArray());[/b][/b][b][b]restoreGeometry(ba);[/b][/b] [存盤:]復制代碼[b][b]settings.beginGroup("<起個唯一名字 存取對應>");[/b][/b][b][b]settings.setValue(QLatin1String("geometry"), saveGeometry());[/b][/b][b][b]settings.endGroup();[/b][/b] 測驗:在~CustomDockWidget內呼叫[存盤]. 在addDockWidget完后[恢復]. 測驗結果: 在取出normalGeometry時失敗=>資料無效.驗證結果:在~CustomDockWidget中,saveGeometry()之前,獲取復制代碼[b][b]QRect rect1 = frameGeometry(); // 有效[/b][/b][b][b]QRect rect2 = normalGeometry(); // 無效 (0,0,-1,-1)[/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時,設定失敗(只有這種順序失敗)。
uj5u.com熱心網友回復:
使用一行代碼就好了
resizeDocks({dock},{200},Qt::Horizontal);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/96523.html
標籤:其他技術討論專區
上一篇:vm啟動虛擬Starting postfio FALLED 怎么辦,跪求各位大佬
下一篇:基于openmv的顏色識別機械臂
