我正在尝试使用最新版本的Qt解决图形问题。下图显示了到目前为止我能做的事情,我将用它来解释预期的结果。

c++ - 在qt中将方形qWidget居中-LMLPHP

我使用的是主要的垂直布局,并且在该布局的最大窗口小部件中,只有一个孩子的水平布局是:正方形窗口小部件。预期的行为当然是使方形小部件水平居中并占用最大可用空间。不需要使用相同的布局配置,但是界面的外观应该相同。

上面的图像是通过以下方式获得的:为方形小部件设置垂直和水平方向的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/

10-13 08:28