不调用QWidget :: heightForWidth()

时间:2013-07-17 19:20:40

标签: c++ qt

我想让我的小部件总是有方形大小。在this answer之后,我已覆盖QWidget::heightForWidth(),我也在构造函数中调用setHeightForWidth(true),如@peppe所示。大小政策设置为Preferred,Preferred(水平尺寸和垂直尺寸)。

但是,heightForWidth()未被调用。我有什么问题吗?

这是我的Widget类中的heightForWidth()声明:

virtual int heightForWidth(int) const;

这种情况发生在Linux和Windows上。

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:1)

如果小部件位于布局中,则必须重新实现

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

布局类的功能。