2016-11-04 37 views
1

這裏是我的測試代碼:如何在強制固定寬高比時停止窗口大小跳動?

import QtQuick 2.4 
import QtQuick.Window 2.2 

Window { 
    visible: true 
    readonly property int defaultWidth: 700 
    readonly property int defaultHeight: 500 
    width: defaultWidth 
    height: defaultHeight 

    readonly property real aspectRatio: defaultWidth/defaultHeight 
    readonly property real scaleFactor: width/defaultWidth 

    onWidthChanged: { 
     var properHeight = Math.round(width/aspectRatio); 
     if (height !== properHeight) { 
      height = properHeight 
     } 
    } 
    onHeightChanged: { 
     var properWidth = Math.round(height * aspectRatio); 
     if (width !== properWidth) { 
      width = properWidth 
     } 
    } 

    TextEdit { 
     id: textEdit 
     text: "Lorem ipsum" 
     font.pixelSize: 40 * scaleFactor 
     anchors.fill: parent 
    } 
} 

它實現固定縱橫比,但它並不能很好地工作:有幾分固定縱橫比的大小和鼠標器之間閃爍(窗口大小的跳躍調整後的大小),並且可以根據寬度和高度變化事件的順序來調整錯誤的尺寸。實際上,當以編程方式調整大小時,窗口邊緣可能會在鼠標光標位置和編程設置的不同位置之間開始跳轉。

什麼應該發生時,它被拖動應遵循的鼠標光標(如在任何大小調整)的窗口邊緣,而另一個邊緣應改變,以保持高寬比:

  • 如果用戶拖動左/右邊緣,底部邊緣應移動以保持寬高比。
  • 如果用戶拖動上/下邊緣,則右邊緣也應移動以保持寬高比。
  • 當用戶拖動一個角落裏,有兩種可能的大小取,以保持高寬比,如高度或寬度可以被編程改變。如何確定這一點並不重要,只要它是一致的即可。
  • 沒問題,如果寬高比只有在調整大小停止後才固定,但實時會更好。但如何可靠地檢測調整大小實際上停止?
  • 如果不能使用Qt獨自完成,我感興趣的是Windows和X11/Linux的具體解決方案。

如何實現調整大小,同時保留長寬比,使用本機窗口調整控件(正常窗口邊框或任何平臺使用),這樣它的行爲邏輯和看起來不錯


編輯,「提示」:我有時間做一些研究,覆蓋QQuickView::resizeEvent並呼籲resize從那裏似乎是能夠做的伎倆,但我沒有時間去得到它的工作非常正確。

回答

3

我有這樣一個問題,有一次,我結束了一個「先有雞還是先有蛋」的悖論,所以我完全禁用窗口裝飾和製作自定義縮放條。這從成立處理一個適當的值流向方面,沒有它的流量是尺寸大小,如果讓任何意義......

如果卸下窗框是不是你的問題,你可以走那條路,對我來說這不是因爲我一直在尋找一個自定義的平臺獨立的樣子,所以窗框實際上是應用程序的一部分:

Window { 
    id: main 
    visible: true 
    width: 500 
    height: 250 
    flags: Qt.FramelessWindowHint | Qt.Window 

    MouseArea { 
     width: 20 
     height: 20 
     anchors.bottom: parent.bottom 
     anchors.right: parent.right 
     onPositionChanged: { 
     var w = mouseX + x, h = mouseY + y 
     if (w > (h * 2)) { 
      main.width = w 
      main.height = w * .5 
     } else { 
      main.height = h 
      main.width = h * 2 
     } 
     } 
     Rectangle { 
     anchors.fill: parent 
     color: "red" 
     } 
    } 
} 

這只是一個簡單的例子,很明顯你應該做一個完整的解決方案各方面和角落。長寬比固定爲2/1。

在我的系統仍然有一些閃爍整個窗口,但我認爲這僅僅是場景圖,但「尺寸跳來跳去」問題有效解決。

編輯:

爲了澄清,我的意思的「流量爲維度尺寸」的是,操縱手柄的尺寸,和你鉤到changed處理程序......做出改變。我懷疑這就是爲什麼它如此片面。如果是這樣,爲了使用窗框進行尺寸調整,必須切斷手柄和窗口尺寸之間的連接以插入縱橫比代碼。不幸的是,在QGuiApplication級別過濾掉resize事件並不妨礙調整大小,但也許有另一種方式來做到這一點,例如覆蓋類。

+0

感謝您的想法。我想我會保持框架,但我可能會做類似於你的事情:不允許正常調整大小,並且只是具有可切換的「正常大小」和「最大化大小」,​​而不是我自己調整大小的句柄。不過,我希望有人用完整的解決方案來回答。 – hyde

+0

唉,過濾掉resize事件不會阻止窗口調整大小,因爲我認爲它會。 – dtech

+0

看起來您可以通過設置最大和最小高度和寬度來停止調整大小,以僅允許一個大小。 – hyde

1

好的,這裏有一個可能的解決方法。它不會嘗試控制窗口大小,而是在窗口內添加額外的項目,然後包含UI的其餘部分,並保持所需的寬高比:如果窗口寬高比不同,則上面有空白區域和用窗口顏色(此處爲「灰色」)繪製的內容區域的下方或左側和右側。內容區域填充「黃色」以顯示區別。

import QtQuick 2.4 
import QtQuick.Window 2.2 

Window { 

    readonly property int defaultWidth: 700 
    readonly property int defaultHeight: 500 
    readonly property real defaultAspectRatio: defaultWidth/defaultHeight 

    readonly property real aspectRatio: width/height 
    readonly property real scaleFactor: content.width/defaultWidth 

    visible: true 
    width: defaultWidth 
    height: defaultHeight 
    color: "gray" 

    Item { 
     id: content 
     anchors.centerIn: parent 
     width: (aspectRatio > defaultAspectRatio) 
       ? parent.height * defaultAspectRatio 
       : parent.width 
     height: (aspectRatio < defaultAspectRatio) 
       ? parent.width/defaultAspectRatio 
       : parent.height 

     Rectangle { color: "yellow"; anchors.fill: parent } // just to show the effect 

     TextEdit { 
      clip: true // text drawing needs to be clipped explicitly 
      id: textEdit 
      text: "Lorem ipsum" 
      font.pixelSize: 40 * scaleFactor 
      anchors.fill: parent 
     } 
    } 
} 

但這只是一個解決方法,而不是問題中要求的完整解決方案,因此問題仍然存在。

相關問題