c++ 如何保持SVG的背景和小部件对齐过程中?

u4dcyp6a  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(113)

我正在开发一个Qt桌面应用程序,我希望有一个SVG作为背景。调整窗口大小时,UI中的小部件应该保持在相对于SVG坐标的位置。
我已经设法使用QUiLoader加载SVG和UI,并将SVG设置为背景。
但是,当我调整窗口大小时,小部件不会保持它们相对于SVG背景的位置。
如何确保小部件和SVG一起缩放,并在调整窗口大小时保持它们的相对位置?
下面是我的代码片段:

QGraphicsSvgItem *svgItem = new QGraphicsSvgItem(":/vectorised-color2.svg");
scene->addItem(svgItem);
view->setScene(scene);
setCentralWidget(view);

QFile file(":/view.ui");
file.open(QFile::ReadOnly);

QUiLoader loader;
QWidget *widget = loader.load(&file, this);
// ... add widget to scene

widget->resize(svgBounds.width(), svgBounds.height());
u5rb5r59

u5rb5r591#

通过QUILoader加载相同的 .ui 文件就可以使用SVG缩放UI。我不知道为什么。如果您加载一个单独的 .ui 文件,这似乎不起作用。

#include "mainwindow.h"
#include <QFile>
#include <QGraphicsProxyWidget>
#include <QGraphicsScene>
#include <QGraphicsSvgItem>
#include <QGraphicsView>
#include <QtUiTools/QUiLoader>
#include "./ui_mainwindow.h"
#include "resizinggraphicsview.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QWidget *spacer = new QWidget(this);
    spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    ui->toolBar->addWidget(spacer);
    ui->toolBar->addAction(ui->actionAbout);

    ResizingGraphicsView *view = new ResizingGraphicsView(this);
    view->setResizeAnchor(QGraphicsView::AnchorViewCenter);
    view->setTransformationAnchor(QGraphicsView::AnchorViewCenter);
    QGraphicsScene *scene = new QGraphicsScene();
    QGraphicsSvgItem *svgItem = new QGraphicsSvgItem(":/vectorised-color2.svg");

    scene->addItem(svgItem);
    view->setScene(scene);
    setCentralWidget(view);

    QFile file(":/mainwindow.ui");
    file.open(QFile::ReadOnly);

    QUiLoader loader;
    QWidget *widget = loader.load(&file, this);

    removeToolbarAndStatusBar(widget);
    QRectF svgBounds = svgItem->boundingRect();
    widget->resize(svgBounds.width(), svgBounds.height());
    file.close();
    widget->setAttribute(Qt::WA_TranslucentBackground);
    QGraphicsProxyWidget *proxy = scene->addWidget(widget);
    proxy->setAutoFillBackground(false);

    // signals need to be explicitly connected
    QPushButton *pushButton = widget->findChild<QPushButton *>("pushButton");
    if (pushButton) {
        connect(pushButton, &QPushButton::clicked, this, &MainWindow::clickbutton);
    }
}

/*
 * This is a hack: For some reason by loading the SAME .ui file (mainwindow),
 * widgets resize in sync while keeping the svg image centered
 * But without this we would get duplicated toolbar and statusbar
 * */

void MainWindow::removeToolbarAndStatusBar(QWidget *widget)
{
    QToolBar *toolbar = widget->findChild<QToolBar *>("toolBar");
    if (toolbar) {
        toolbar->hide(); // or delete toolbar;
    }
    QStatusBar *statusBar = widget->findChild<QStatusBar *>("statusbar");
    if (statusBar) {
        statusBar->hide(); // or delete statusBar;
    }
}
MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::clickbutton()
{
    qDebug() << "button click";
}

备注:

  • 如果您有工具栏或状态栏,则需要手动隐藏它们。
  • 您需要手动连接来自UI小部件的信号。

相关问题