ウィジェットはレイアウト内にある必要があります。以下はQt 4と5の両方で動作します。
Qt 4では、それがレイアウト内にある場合、トップレベルウィンドウの最小サイズのみを強制します。
Qt 5では、トップレベルのウィンドウサイズを強制しません。それには旗があるかもしれませんが、それはバグですが、私は現時点では思い出しません。
#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();
}
ウィジェットのQSizePolicyで対応するフラグを設定しましたか? X11自体はheight-for-widthフラグをサポートしています。 – peppe
このフラグはどちらですか?私のウィジェットのサイズポリシーは 'Preferred'に設定されています。 – sashoalm
QSizePolicyにあります: 'QSizePolicy p = sizePolicy(); p.setHeightForWidth(true); setSizePolicy(p); 'レイアウトもheightForWidthに干渉することに注意してください(同じフラグも持っています)。 – peppe