Qt:组织我的布局和 QSizePolicy

Seu*_*eub 5 c++ layout qt resize

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

主窗口

正如您在图片中看到的,该窗口主要由以下部分组成:

  • 左边的菜单
  • 两块“画布”

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

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

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

(注意:左侧菜单实际上由 3 个不同的小部件(子菜单)组成,窗口还有一个状态栏和一个顶部菜单,但我认为这对我的问题并不重要。)

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

我重写了方法heightForWidth()sizeHint()对于minimumSizeHint()Canvas 像这样:

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);}
    ...
};
Run Code Online (Sandbox Code Playgroud)

我的类 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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

在此输入图像描述

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

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

我的画布的行为似乎与此相矛盾:它们的高度大于其 sizeHint() 提供的高度。(我确实通过 std::couting “live” 来确保:画布 sizeHint、其高度、其 sizePolicy 及其 hasHeightForWidth 参数)。