2013-02-27 34 views
4

我正在寫Qt(Ubuntu 12.04上的4.8.1)應用程序,它在會話之間存儲主窗口幾何體。我注意到,如果widget最大化,qt不會存儲它的非最大化幾何。很顯然,我希望我的應用程序能夠返回它的非最大化大小,如果它自上次最大化以來已關閉/啓動,則大小相同。在QWidget :: save/restoreGeometry如果最大化會丟失窗口大小 - 錯誤或功能?

  1. 主窗口未被最大化並且具有幾何X;
  2. 最大化主窗口;
  3. 保存窗口幾何(使用QWidget :: saveGeometry)來配置文件;
  4. 關閉我的應用程序;
  5. 重新開始;從配置文件
  6. 負載幾何形狀
  7. 還原(未最大化;?)步驟6窗口被最大化(如預期)

之後,但在步驟7之後,它返回到一些內部缺省大小(即,一個在QtCreator中設計表單時設置),而不是持續非最大化幾何X.

這是期望的行爲嗎?或者是不可能/難以在qt內部實現?

是因爲當最大化時,窗口管理器記住非最大化的大小,而不是qt(至少在linux上)?

回答

4

當窗口最大化開始時,不需要保存幾何圖形。

要獲得您所需的功能,就像修改步驟如下:

  1. 主窗口沒有最大化,具有幾何X;
  2. 保存幾何X也窗口的左上角位置爲QPoint
  3. 最大化主窗口;
  4. 執行不是保存幾何圖形(您可以在保存到配置文件之前使用QWidget::isMaximized()來確定窗口狀態是否最大化)。改爲將新的isMaximised狀態值保存到配置文件中。
  5. 關閉我的應用程序;
  6. 重新開始;
  7. 在打電話前window->show()應用window->resize(lastQSizeSavedinSettingsofNonMaximisedState)window->move(lastQPointSavedinSettingsofNonMaximisedState)
  8. 現在從配置檢查isMaximised狀態值,如果屬實,只需撥打QWidget::showMaximized()否則只是QWidget::show()
  9. 現在,當你恢復窗口的大小,你應該有你想要的功能:)

使用窗口大小/狀態時要記住一些事項。

當應用程序啓動並且您嘗試還原的值不再位於屏幕邊界內時,始終提供後備幾何圖形和位置,以防上次保存的位置超出範圍。 (這有助於解決某人更改分辨率/監視器計數/顯示器位置/虛擬桌面的情況)

+0

這意味着我必須始終跟蹤我的寡婦大小/位置 - 每次調整大小。第3點不是由我的代碼完成的,而是由用戶單擊窗口欄上的最大化按鈕完成的。事實上,在目前的開發階段,我列出的所有步驟都是由用戶單獨激活的。無論如何 - 這不是我的問題的重點 - 我知道我的方式圍繞小部件的幾何形狀,並控制它 - 但我認爲'QWidget :: saveGeometry'的存在完全是爲了擺脫我的擔心 - 因爲我必須寫幾何無論如何保存/恢復,是否意味着它沒有達到目的(被竊聽)? – 2013-02-27 12:56:20

+0

QWidget.cpp確實嘗試使用QWidget :: restoreGeometry(...)的QByteArray參數中的windowStates恢復normalGeometry和frameGeometry。我會說如果它不起作用,提出一個QT Bug,因爲在另一個bug中https://bugreports.qt-project.org/browse/QTBUG-21371最後一個但是第6個評論指示normalGeometry在去時被重置從全屏/最大化到正常狀態,這在Qt 4.7中沒有發生。正如我猜你知道有幾個解決方法。也不知道Qt 5是否解決了它。這是Qt嘗試做某事並且不正確的一個例子= bug – Viv 2013-02-27 14:28:40

0

我認爲你遇到的問題來自許多可讀和可設置QWidget的幾何和尺寸。具體而言,您可能需要查看normalGeometry,height,width,maximumHeight,maximumWidth,minimumHeight,minimumWidth等之間的差異。

+0

我的問題在上述條款重申:'QWidget的:: saveGeometry'沒有按不存儲'normalGeometry'。爲什麼不?有沒有共鳴?似乎對我有用。 (最小/最大尺寸與此無關)。 – 2013-02-27 13:00:24

0
4.不保存幾何圖形(您可以在保存到配置之前使用QWidget :: isMaximized()來確定窗口狀態是否最大化文件)。改爲將新的isMaximised狀態值保存到配置文件中。

這裏的另一個問題是:根據窗口在屏幕上的位置,窗口不會被最大化/最小化,而是基於窗口的大部分位置。如果窗口的80%在屏幕1上,但左上角在屏幕2上,則最大化的窗口將在屏幕1上。

不過,你的想法是最好的。在谷歌(使用QT5)的一小時後,我現在使用:

writeSettings:

settings.setValue("pos", pos()); 
if(!isMaximized()) 
    settings.setValue("size", size()); 
settings.setValue("maximized", isMaximized()); 

readSettings:

if(settings.contains("pos")) 
    move(settings.value("pos").toPoint()); 
if(settings.contains("size")) 
    resize(settings.value("size").toSize()); 

if(settings.value("maximized").toBool()) 
    setWindowState(windowState() | Qt::WindowMaximized); 
+1

我明白了,並且我知道如何實現所需的結果(使用與您的解決方案類似的東西),但是整個觀點是:'saveGeometry'應該將我從必需編寫所有這些代碼,只做本身的明顯事情。我的問題是:這是一個錯誤,還是有這種行爲背後的動機? – 2013-11-15 21:03:00