2013-07-17 13 views
8

私のウィジェットは常に正方形のサイズにします。 this answerに続いて、私はQWidget::heightForWidth()をオーバーライドしました。コンストラクタでは@peppeのようにsetHeightForWidth(true)も呼び出します。サイズポリシーはPreferred,Preferred(水平サイズと垂直サイズの両方)に設定されています。QWidget :: heightForWidth()が呼び出されていません

ただし、heightForWidth()は呼び出されていません。私が間違っていることは何ですか?

これは私のWidgetクラスで)heightForWidth(の宣言です:

virtual int heightForWidth(int) const; 

これは、LinuxおよびWindows上で起こります。

+1

ウィジェットのQSizePolicyで対応するフラグを設定しましたか? X11自体はheight-for-widthフラグをサポートしています。 – peppe

+0

このフラグはどちらですか?私のウィジェットのサイズポリシーは 'Preferred'に設定されています。 – sashoalm

+0

QSizePolicyにあります: 'QSizePolicy p = sizePolicy(); p.setHeightForWidth(true); setSizePolicy(p); 'レイアウトもheightForWidthに干渉することに注意してください(同じフラグも持っています)。 – peppe

答えて

2

ウィジェットはレイアウト内にある必要があります。以下はQt 4と5の両方で動作します。

Qt 4では、それがレイアウト内にある場合、トップレベルウィンドウの最小サイズのみを強制します。

Qt 5では、トップレベルのウィンドウサイズを強制しません。それには旗があるかもしれませんが、それはバグですが、私は現時点では思い出しません。

screenshot

#include <QApplication> 
#include <QWidget> 
#include <QPainter> 
#include <QDebug> 
#include <QVBoxLayout> 
#include <QFrame> 

class Widget : public QWidget { 
    mutable int m_ctr; 
public: 
    Widget(QWidget *parent = 0) : QWidget(parent), m_ctr(0) { 
     QSizePolicy p(sizePolicy()); 
     p.setHeightForWidth(true); 
     setSizePolicy(p); 
    } 
    int heightForWidth(int width) const { 
     m_ctr ++; 
     QApplication::postEvent(const_cast<Widget*>(this), new QEvent(QEvent::UpdateRequest)); 
     return qMax(width*2, 100); 
    } 
    QSize sizeHint() const { 
     return QSize(300, heightForWidth(300)); 
    } 
    void paintEvent(QPaintEvent *) { 
     QPainter p(this); 
     p.drawRect(rect().adjusted(0, 0, -1, -1)); 
     p.drawText(rect(), QString("h4w called %1 times").arg(m_ctr)); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QWidget w; 
    QVBoxLayout * l = new QVBoxLayout(&w); 
    l->addWidget(new Widget); 
    QFrame * btm = new QFrame; 
    btm->setFrameShape(QFrame::Panel); 
    btm->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); 
    l->addWidget(btm); 
    w.show(); 
    return a.exec(); 
} 
+0

ありがとうございます。私はちょうどそれをテストした、それは動作します。それはWindows上でトップレベルのウィンドウのサイズを強制しますが、Linuxでは強制しません。サポートされていない可能性があります。 – sashoalm

+0

これは、X11でウインドウマネージャープロトコルの設計が厄介なためです:(うまくいけば、Waylandがうまくいけばそれは再び働くでしょう) –

+0

うん、それはあなたのコードで動作しますが、QMainWindowで動作させると、 QVBoxLayoutをcentralWidget()に設定しようとしましたが、うまくいきませんでした。 – sashoalm

0

ウィジェットを使用すると、レイアウトクラスの

bool hasHeightForWidth() const{ return true; } 
int heightForWidth(int w) const { return w; } 

関数を再実装する必要があり、レイアウトにある場合平方滞在します。

関連する問題