我正在尝试使用最新版本的Qt解决图形问题。下图显示了到目前为止我能做的事情,我将用它来解释预期的结果。
我使用的是主要的垂直布局,并且在该布局的最大窗口小部件中,只有一个孩子的水平布局是:正方形窗口小部件。预期的行为当然是使方形小部件水平居中并占用最大可用空间。不需要使用相同的布局配置,但是界面的外观应该相同。
上面的图像是通过以下方式获得的:为方形小部件设置垂直和水平方向的QSizePolicy的minimumExpanding,并通过以下代码将其强制为方形:
void SquareWidget::resizeEvent(QResizeEvent *event) {
//This is an override to the QWidget method
QSize s = size();
if (s.height()<s.width()) {
resize(s.height(), s.height());
} else {
resize(s.width(), s.width());
}
return;
}
在尝试解决此问题时,我浏览了该网站上的一些文档,但找不到关于如何执行两项任务的明确答案。
第一个问题:如何使小部件方形并保持其长宽比?
In this question
有人说,heightForWidth()方法在较新版本的qt中不起作用,经过测试后,它对我也不起作用。另一方面,上面对resizeEvent的覆盖会导致递归,因为有对resize()的调用(据我所知,布局应处理调整大小)。
第二个问题:如何使正方形居中?
我尝试使用布局对齐属性(水平和垂直居中),但它们导致小部件尺寸不可变。
也许我对Qt如何处理小部件放置不了解。任何建议或澄清将不胜感激。
最佳答案
与其尝试使小部件保持其自身的方形和居中,不如将其重新放置并在父小部件类型中放置所需的逻辑可能更简单。
所以,类似...
class keep_child_square_and_centred: public QWidget {
using super = QWidget;
public:
explicit keep_child_square_and_centred (QWidget *parent = nullptr)
: super(parent)
, m_widget(nullptr)
{}
virtual void set_widget (QWidget *widget)
{
if ((m_widget = widget))
m_widget->setParent(this);
}
virtual QSize sizeHint () const override
{
return(m_widget ? m_widget->sizeHint() : super::sizeHint());
}
protected:
virtual void resizeEvent (QResizeEvent *event) override
{
super::resizeEvent(event);
fixup();
}
private:
void fixup ()
{
if (m_widget) {
QRect r(QPoint(), QSize(height(), height()));
r.moveCenter(rect().center());
m_widget->setGeometry(r);
}
}
QWidget *m_widget;
};
然后用作...
keep_child_square_and_centred w;
SquareWidget sq;
w.set_widget(&sq);
如果父级处于布局中,则可能仍需要进行一些设置。
关于c++ - 在qt中将方形qWidget居中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43306675/