2011-08-24 13 views
5

我有Qt的各種大小問題。我正在創建我自己的小部件並使用不同的佈局(通常,我需要我自己的才能使它們正常工作,而無需在「強大的」默認佈局上花費數小時......這不會按預期佈置事物。)什麼使Qt小部件及其佈局的行爲正確(關於它的大小)?

一旦我完成了一個小部件和它的佈局,但它並不正確。除非我呼叫widget->resize(1, 1);,這會最終強制「調整大小」並使小部件看起來正確(即重新計算幾何圖形),否則大小永遠無法正確設置。即使updateGeometry()調用也不起作用。

這是一個可怕的問題,當需要在父窗口小部件(yuck!)上調用resize()時,並且我正在閱讀的內容應該沒有必要,因爲佈局是正確編程的。

是否有一個樣本可以工作,並且不是幾千行的長度,或者Qt是否需要幾千行來完成任何工作,即使是最簡單的小部件?

什麼是最小功能被調用來使一個小部件&它的佈局一次工作?

謝謝。 Alexis

P.S.我試圖執行sizeHint(),minimumSize(),maximumSize(),我失蹤的其他人?我希望這足夠。很顯然,我還在佈局上實施了setGeometry()以適當調整孩子的大小。

---另外1

有一個帶佈局,清楚地不能作爲是Qt中的樣本圖像。不同按鍵的位置,功能和顏色是由XML驅動的,適用於世界上任何鍵盤。

On screen keyboard

(注意,這個樣本沒有顯示兩行,比上寬下窄下面顯示的回車鍵,或多或少,是不可行的所有常規佈局;當然,它我的版本的作品。)

---澄清

我也不太清楚如何更好地說明問題。我正在考慮編寫一個測試小部件,看看如何重現問題,然後發佈並最終解決問題。 8-)

內部Qt佈局使用的默認佈局函數需要大量編碼。我想避免複製/粘貼所有這些,因爲對於維護而言,這使得它幾乎不可能。

---今天的調查結果

因爲我需要來調整窗口小部件之一,我決定增加一個VBoxLayout,並使其發揮作用。

我確實發現了問題...我樹中的一個小部件是QScrollArea,並且sizeHint()返回(-1,-1)。不完全是我所期望的,但是......無論你放在那個小部件裏面,你都知道如何計算它的寬度和高度,否則......它會失敗。

仔細查看代碼,我實際上可以通過使用找到的最寬寬度來計算寬度。一旦我使用了它,這個小部件就會出現(並且它實際上會隨着列表中的東西的變化而自動調整大小,0127)。從根到樹中葉子的父母,所有這些小部件都需要有效的佈局。一旦我在頂部的小部件中添加了一個,它就可以正確調整自己和孩子的身高(好吧...在我的情況下,達到QScrollArea,其餘部分需要從底部到頂部調整大小。)

---啊!哈! (或:你發現讀取實現代碼的內容!)

今天我碰到了另一個只需要正確調用的問題......我在文檔中找不到任何值得的東西。

所有對象現在都有一個佈局,但是某個父級不會正確調整大小。平原簡單。

我有如下父通話:

// changes to the children are changing the geometry 
parentWidget()->updateGeometry(); 

呀。文檔說這就是你必須做的。那個電話根本沒有任何反應。不知道它應該做什麼,我沒有看到這個功能。無論如何,它從未爲我做過任何事情。

所以......我查看了佈局,試圖瞭解它將如何向上/向下發送信息。我沒有看到太多,除了一個有趣的評論:

// will trigger resize 

這是說,SetFixedSize模式。要達到該功能,您需要製作更新佈局。啊!是的...佈局,而不是父窗口小部件...讓我們來嘗試,而不是:

parentWidget()->layout()->update(); 

瞧!它在所有情況下正確調整大小。很不可思議的是,小工具updateGeometry()不會觸發相同的效果...

+2

它是什麼,你要完成內置版圖系統不能爲你做什麼?當它基本上歸結爲「我如何使事情發揮作用?」時,很難回答一個對你有用的問題。 – Chris

+0

對於圖形用戶界面/佈局排隊,包括帶註釋的屏幕截圖可以提供很多幫助。有沒有人在這裏,喜歡當他們有可靠的信息時想出來的東西:) –

+0

如果你沒有問題你的代碼,那麼你可以在www.ideone.com上分享:D – blueskin

回答

1

這不會幫助您解決您的直接問題,但我想向您展示我使用標準佈局和按鈕製作的鍵盤。這不是完美的,它仍然不會幫助你跨越兩行的輸入鍵,但它並不壞。它也可以通過調整窗口大小來調整大小,雖然我不確定這是否會從下面的圖像中看出來,因爲SO可能會縮放它們。 (你可以在自己的標籤打開它們查看實際圖像)

enter image description here

enter image description here

無論如何,這是隻使用不帶手動編碼Qt設計完成。它由頂層垂直佈局和5個水平佈局組成。然後將這些按鈕插入5個水平佈局中的一個。可以通過將水平和垂直尺寸策略設置爲「忽略」大多數按鈕,然後水平「最小化」按鈕來控制按鍵的大小。可以通過設置按鈕的最小和最大尺寸限制來調整內容。當調整大小時,按鈕不會保持其相對比例,這可能需要一些自定義編程。

在你的例子中的樣式可以近似使用CSS樣式表和背景圖像。仍然不是一個小的努力,但你應該能夠在沒有自定義佈局和按鈕的情況下獲得大部分的方式。

+1

是的。 QSS有很多問題。它僅在創建小部件時級聯。之後,它完全忘記了父母。所以這實際上並不實際。這就是說,我使用QSS的顏色,邊界,字體大小,圖像... 現在,思考它,我想知道如果我的問題可能是真的,因爲所有的祖先不包括佈局。我想我在某處讀到佈局能夠很好地工作,你需要他們到處都是。 最後,在我的情況下,鍵盤可以切換到各種佈局。例如,我可以將其更改爲Kania或法語鍵盤。 –

2

雖然有可能做你想做的事情,但聽起來像你遇到的問題是因爲你使用Qt的方式並不意味着被使用。爲什麼鍵盤上顯示的每個鍵需要單獨的小部件?

我看到兩個選項,這兩者都是以某種方式更好:

  1. 使用QGraphicsSceneQGraphicsView
  2. 使用自定義繪圖顯示鍵盤的單個自定義小部件(並可能使用懸停提示)。

第一個選項可能會更好。您的密鑰可以用QGraphicsSimpleTextItem或甚至QGraphicsSvgItem來表示。它還提供了許多標準佈局,或者您可以選擇write your own layout。默認情況下,您可以使用​​或mouseReleaseEvent來響應用戶交互。

我強烈建議你看一看QGraphicsView examples以瞭解你可以做什麼。

如果你走第二條路線,你需要記錄不同的關鍵位置,因此您可以在用戶周圍移動鼠標,點擊相應的反應,等等。

+0

在這種情況下,我需要手動渲染所有東西嗎?隨着PushButtons我得到了免費的渲染和點擊()事件... 此外我的鍵盤是一個例子,我遇到的問題是在一個列表中,因爲QScrollArea佈局鏈斷裂(即低於QScrollArea大小不受高度的限制,我們想調整QScrollArea內部的窗口部件的大小盡可能高!但QScrollArea必須是一個合理的尺寸。) –

+0

對每條評論進行編輯。 –

相關問題