2011-08-31 57 views
4

我明白,在Qt4中,您可以設置任何一個標誌來讓窗口的鼠標驅動大小保持一定的縱橫比(比如1:1)。有沒有辦法在「resizeEvent(QResizeEvent * event)」時強制窗口的新大小?事件的參數似乎不支持更改,或者讓用戶有機會注入新的大小。在調整主窗口大小時強制顯示比例

我的目標:GUI /鼠標調整某個窗口的大小將保持其當前的高寬比,無論您在哪裏調整大小(從側面,頂部,底部,角落)。

回答

2

重複的問題? How to maintain widgets aspect ratio in Qt?

援引「DF」的答案,從內resizeEvent()上面的鏈接

調用調整()從來沒有運作良好 我 - 充其量會造成閃爍的窗口被調整大小兩次 (如你所見),最壞的情況是無限循環。

我認爲「正確」的方式來保持固定的高寬比是 創建一個自定義佈局。你必須重寫兩個方法, QLayoutItem :: hasHeightForWidth()和QLayoutItem :: heightForWidth()。

也會檢出山姆達頓公司的解決方案@http://lists.trolltech.com/qt-interest/2007-01/msg00204.html

void MyWindow::resizeEvent(QResizeEvent * /*resizeEvent*/) 
{ 
    int containerWidth = _myContainerWidget->width(); 
    int containerHeight = _myContainerWidget->height(); 

    int contentsHeight = containerHeight ; 
    int contentsWidth = containerHeight * _aspectRatio; 
    if (contentsWidth > containerWidth) { 
     contentsWidth = containerWidth ; 
     contentsHeight = containerWidth/_aspectRatio; 
    } 

    resizeContents(contentsWidth, contentsHeight); 
} 
+3

不知道爲什麼我必須處理佈局?我只需要主窗框來保持寬高比。內部小部件與主框架的任何尺寸都兼容,因爲當我自由調整框架大小時,它們可以很好地展開。 – JasonGenX

2

在線程referenced by @blueskin引述消息:

這是相當困難的事情。大多數窗口系統不允許 允許應用程序在最大和最小尺寸以外的窗口上設置約束,並且它可以是固定大小。

嘗試此操作的最常見方法是在resize事件中調用resize。這通常會導致遞歸問題,或者看起來很奇怪,因爲小部件會以用戶未請求的方式調整大小。

由於大多數窗口系統不允許進行適當調整的主窗口,最好的解決辦法往往是制約一個子控件,而不是父母。這樣做的一個方法是使用libqxt提供的類。

libqxt支持通過其QxtLetterBoxWidget保持子窗口小部件在一定的縱橫比。 @ blueskin的answer提供了一個很好的嘗試去做最初的要求。

如果你有興趣,我建議你閱讀sourceresizeWidget()函數,並觀察它被調用的地方。作爲背景,libqxt使用pimpl成語,qxt_d()獲取私有成員。

+0

爲什麼使用小部件?我需要我的主窗口來保持寬鬆比例,所有的國際小工具都有尺寸拉伸和任意大小的政策。它只是限制主框架始終保持其寬高比? – JasonGenX

+0

我編輯了我的答案,以澄清爲什麼通常使用子窗口小部件/佈局。 –

1

另一種快速和更簡單的方式來做到這一點: http://developer.qt.nokia.com/forums/viewthread/5320/#31866

#include <QWidget> 
#include <QApplication> 
#include <QSizePolicy> 

class MyWidget:public QWidget 
{ 
public: 
    MyWidget():QWidget(){}; 
    ~MyWidget(){}; 
    virtual int heightForWidth (int w) const { return w*9/16;}; 
}; 

int main (int argv, char** argc) 
{ 
    QApplication a(argv,argc); 
    MyWidget w; 
    QSizePolicy qsp(QSizePolicy::Preferred,QSizePolicy::Preferred); 
    qsp.setHeightForWidth(true); 
    w.setSizePolicy(qsp); 
    w.show(); 

    a.exec(); 
} 
+0

我拿着代碼,試圖在Mac OSX和Qt 4.7.3下運行 - 沒有任何效果。窗口自由調整大小,不受任何約束 – JasonGenX

+0

heightForWidth不被頂級窗口小部件使用,只用於佈局管理器。 – chacham15

相關問題