gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:12:03 44 4
gpt4 key购买 nike

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

The result of my work

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

上图是通过为方形小部件的垂直和水平设置 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变成正方形并保持宽高比?

In this question

据说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);
}

Please see the result here

关于c++ - 在qt中居中方形qWidget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43306675/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com