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

标签 c++ qt c++11

我正在尝试使用最新版本的 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/

相关文章:

c++ - 使用 std::count 计算一对数组中的相等值

c++ - 使用 std::async 控制并行度

c++ - 一旦执行完成就杀死子进程(在fork之后)

qt - QVariant::QVariant(Qt::GlobalColor)' 是私有(private)的

c++ - 具有返回值的信号/插槽不起作用

c++ - output_tensor 出现 dlib fatal error

c++ - 如何在编译时调试模板参数?

c++ - 使用时间(NULL)时的奇怪行为

c++ - 在 Qt 和 C++ [QMediaPlayer] 中更改 mp3 速度

C#-Like Delegates in C++