我的Qt / C ++程序的主窗口如下所示:
正如您在图片中看到的那样,窗口主要包括:
我想要的是直接描述:我希望在调整窗口大小的同时,两个画布尽可能多地占用空间,但仍保持正方形(宽度=高度)。我一直在努力实现这一目标。
让我快速描述一下这些对象:
Window
。它有一个QGridLayout
的布局。LeftMenu *menu
和画布Canvas *leftCanvas, *rightCanvas
。 LeftMenu
和Canvas
都是派生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)
。这听起来太复杂了吗?
无论如何,它已经失败了,我不明白为什么。如果我水平收缩窗口,它会给我这个:
因此,画布的高度不会缩小。我不明白这种行为。在Qt文档(http://doc.qt.io/qt-4.8/qsizepolicy.html#Policy-enum)中,我读到了:
QSizePolicy :: Maximum sizeHint()是最大值。如果其他小部件需要空间(例如分隔线),则小部件可以收缩任何数量而没有损害。它不能大于sizeHint()提供的大小。
我的画布在这里的行为似乎与此相矛盾:它们的高度大于它们的sizeHint()所提供的高度。 (我确实通过std :: couting“live”确定:canvas sizeHint,它的高度,sizePolicy和hasHeightForWidth参数。)