我正在尝试使用最新版本的 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;
}
在尝试解决这个问题时,我浏览了该网站上的一些答案文档,但我找不到关于如何完成两项任务的明确答案。
第一个问题:如何让widget变成正方形并保持宽高比?
据说heightForWidth()这个方法在新版本的qt中不起作用,我测试了一下也不行。另一方面,上面对 resizeEvent 的覆盖会导致递归,因为存在对 resize() 的调用(据我所知,布局应该处理调整大小)。
第二个问题:如何让正方形居中?
我尝试使用布局对齐属性(水平居中和垂直居中),但它们会导致小部件大小不可变。
也许我不太了解 Qt 如何处理小部件放置。任何建议或澄清将不胜感激。
最佳答案
您可以使用 QGridLayout 来做到这一点.
请看附件代码。
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
class MyWidget final : public QWidget
{
Q_OBJECT
protected:
virtual void resizeEvent(QResizeEvent * event) override;
};
class MainWindow final : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow() = default;
};
#endif // MAINWINDOW_H
主窗口.cpp
#include "mainwindow.h"
#include <QGridLayout>
#include <QLabel>
#include <QResizeEvent>
#include <QSpacerItem>
void MyWidget::resizeEvent(QResizeEvent * event)
{
event->accept();
const QSize current_size = size();
const int min = std::min(current_size.width(), current_size.height());
resize(min, min);
}
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
auto main_widget = new QWidget;
auto header = new QLabel("Hello World");
auto center_widget = new MyWidget;
auto footer = new QLabel("Good bye World");
auto spacer_left = new QSpacerItem(10, 10, QSizePolicy::Expanding);
auto spacer_right = new QSpacerItem(10, 10, QSizePolicy::Expanding);
auto grid_layout = new QGridLayout(main_widget);
auto center_palette = center_widget->palette();
center_palette.setColor(QPalette::Background, Qt::blue);
center_widget->setAutoFillBackground(true);
center_widget->setPalette(center_palette);
grid_layout->addWidget(header, 0, 1);
grid_layout->addItem(spacer_left, 1, 0);
grid_layout->addWidget(center_widget, 1, 1);
grid_layout->addItem(spacer_right, 1, 2);
grid_layout->addWidget(footer, 2, 1);
header->setAlignment(Qt::AlignCenter);
footer->setAlignment(Qt::AlignCenter);
setCentralWidget(main_widget);
}
关于c++ - 在qt中居中方形qWidget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43306675/