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 参数)。
归档时间: |
|
查看次数: |
5426 次 |
最近记录: |