问:组织我的布局和QSizePolicy

时间:2015-07-01 14:36:44

标签: c++ qt layout resize

我的Qt / C ++程序的主窗口如下所示:

main window

正如您在图片中看到的那样,窗口主要包括:

  • 左侧的菜单
  • 两个“画布”

我想要的是直接描述:我希望在调整窗口大小的同时,两个画布尽可能多地占用空间,但仍保持正方形(宽度=高度)。我一直在努力实现这一目标。

让我快速描述一下这些对象:

  • 该窗口是我创建的派生QWidget的类Window。它有一个QGridLayout的布局。
  • 窗口的布局有三个小部件:左侧菜单LeftMenu *menu和画布Canvas *leftCanvas, *rightCanvasLeftMenuCanvas都是派生QWidget的自定义类。

(注意:左侧菜单实际上包含3个不同的小部件(子菜单),窗口也有状态栏和顶级菜单,但我不认为这对我的问题很重要。)

我一直在用QSizePolicy等“玩”(尽量不开玩笑)试图让Canvases的尺寸表现得像我想要的那样(在窗口内尽可能大,但保持高/宽比= 1),但未成功。让我描述一下对我有用的最新尝试(如果你已经知道我的问题的解决方案,你不必继续阅读):

我为Canvas覆盖方法heightForWidth()sizeHint()minimumSizeHint(),如下所示:

class Canvas : public QWidget
{
    Q_OBJECT

    friend class Window;

public:
    explicit Canvas(Window* window);
    ...

private:
    void resizeEvent(QResizeEvent *resizeEvent) override;
    int heightForWidth(int width) const override {return width;}
    QSize sizeHint() const override
    {
        int size = std::min(width(), height());
        return QSize(size, size);
    }
    QSize minimumSizeHint() const override {return QSize(200,200);}
    ...
};

我的类Window的构造函数看起来像(有点简化):

Window::Window(ActionHandler *handler)
{
    leftMenu = new LeftMenu(this);
    leftMenu->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);

    leftCanvas = new Canvas(this);
    rightCanvas = new Canvas(this);
    QSizePolicy policy(QSizePolicy::Expanding, QSizePolicy::Maximum);
    policy.setHeightForWidth(true);
    leftCanvas->setSizePolicy(policy);
    rightCanvas->setSizePolicy(policy);    

    layout = new QGridLayout;    
    layout->setColumnMinimumWidth(0, menuWidth());    
    layout->addWidget(leftMenu, 0, 0);
    layout->addWidget(leftCanvas, 0, 1);
    layout->addWidget(rightCanvas, 0, 2);
    setLayout(layout);
}

我的想法是,只要画布的宽度是限制因素,画布的sizePolicy应为(QSizePolicy::Expanding, QSizePolicy::Maximum)。一旦画布的高度成为限制因素,我就会将画布的sizePolicy(可能在Canvas::resizeEvent()中)改为相反的:(QSizePolicy::Maximum, QSizePolicy::Expanding)。这听起来太复杂了吗?

无论如何,它已经失败了,我不明白为什么。如果我水平收缩窗口,它会给我这个:

enter image description here

因此,画布的高度不会缩小。我不明白这种行为。在Qt文档(http://doc.qt.io/qt-4.8/qsizepolicy.html#Policy-enum)中,我读到了:

QSizePolicy :: Maximum sizeHint()是最大值。如果其他小部件需要空间(例如分隔线),则小部件可以收缩任何数量而没有损害。它不能大于sizeHint()提供的大小。

我的画布在这里的行为似乎与此相矛盾:它们的高度大于它们的sizeHint()所提供的高度。 (我确实通过std :: couting“live”确定:canvas sizeHint,它的高度,sizePolicy和hasHeightForWidth参数。)

0 个答案:

没有答案